生成器,三元表達式,匿名函數,內置函數day13

今日學習總結:python

1、生成器:生成的工具,是一個自定義的迭代器。本質上是一個迭代器。編程

 1.自定義生成器app

01.但凡在函數內部定義了的yeild函數

02.調用函數時,函數體代碼不會執行工具

03.會返回一個結果,該結果就是一個生成器對象學習

2. yieldspa

00.能夠返回屢次的值設計

01.只能在函數內部定義code

02.能夠保存函數的暫停狀態orm

03.每一次yield都會往生成器對象中添加一個值

3.建立一個生成器對象有兩種方式

01.一種是調用帶yield關鍵字的函數

02.另外一種就是生成器表達式,與列表生成式的語法格式相同,只須要將[]換成()

def func():

     print('form word')

     yield 'tank'

res=func()            #此時res是迭代器對象

print(res._next_())



其實,res._next_()  與  next(res)    相等
def func():

     print('form word')

     yield 'tank'

res=func()            #此時res是迭代器對象

print(next(res))   

 

3. return

 01. return只能返回一次的值

 02. return能夠返回任意類型的值

 

4. range

自定義range功能,建立一個自定義的生成器

def my_range(start,end,move=1):

       while start<end:

               yield start

               start+=move

 g_range=my_range(1,5)

print(g_range)

2、面向過程編程:是一門編程思想,核心是‘過程’二字。過程是指一種解決問題的步驟,既是先幹什麼再幹什麼。基於該編程思想寫程序,就像設計一條流水線,一種機械式的思惟。

優勢:將複雜的問題流程化,進而簡單化

缺點:可擴展性差,既是若改變當前程序的某一部分,則須要改動其餘程序。(牽一髮而動全身)

 例子:登陸認證,保存在一個文件

def get_user_pwd():                                    # 1.先讓用戶輸入用戶名和密碼,校驗合法性
    while True:
        username = input('請輸入用戶名:').strip()
        if username.isalpha():                         # 校驗用戶名是否爲 英文字母  str.isalpha 校驗英文字母、中文
            break
        else:
            print('用戶名不合法')

    while True:
        password = input('請輸入密碼:').strip()
        re_password = input('請確認密碼:').strip()
        if password == re_password:           # 校驗兩次密碼是否一致
            break
        else:
            print('兩次密碼不一致。')

    return username, password


def cut_user_pwd(user, pwd):                   # 2.拼接用戶字符串
    user_pwd_str = f'{user}:{pwd}\n'
    return user_pwd_str

  
def save_data(user_pwd_str)                    # 3.保存用戶數據,寫入文件中
    with open('user.txt', 'a', encoding='utf-8') as f:
        f.write(user_pwd_str)


# 註冊功能Demo
def register():
    user, pwd = get_user_pwd()                 # 1.設計先讓用戶輸入用戶名和密碼,校驗合法性,獲得合法的用戶名與密碼
    user_pwd_str = cut_user_pwd(user, pwd)     # 2.設計字符串的拼接, 獲得拼接好的字符串
    save_data(user_pwd_str)                    # 3.開始寫入文件

register()

 

例子:登陸認證,以不用的用戶名保存文件

def gut_user_pwd():
    while True:
        username=input('請輸入你要註冊的用戶名:').strip()
        if username.isalpha():
            break
        else:
            print('輸入的用戶名不合法')
    while True:
        password=input('請您輸入註冊的密碼:').strip()
        re_password=input('請您再次輸入註冊的密碼:').strip()
        if password==re_password:
            break
        else:
            print('您輸入的密碼不一致')
    while True:
        user_role=input('請輸入您的角色').strip()
        list=['普通用戶','超級用戶','管理員用戶']
        if user_role in list:
            print('恭喜您註冊成功')
            break
        else:
            print('您輸入的角色不正確')
    return username,password,user_role
def cut_user_pwd(user,pwd,role):
    user_pwd_str=f'{user}:{pwd}:{role}\n'

    return user_pwd_str,user                      # 在這裏把 user 用戶名返回了

def save_data(user_pwd_str,name):
    with open(f'{name}.txt','w', encoding='utf-8') as f:
        f.write(user_pwd_str)
def register():
    user,pwd,role=gut_user_pwd()                  #在這裏把gut_user_pwd()裏獲得的返回值解壓賦值了
    user_pwd_str,name=cut_user_pwd(user,pwd,role) ##在這裏把cut_user_pwd(user,pwd,role)裏獲得的返回值解壓賦值了
    save_data(user_pwd_str,name)
register()

 

 

3、三元表達式

   能夠將if...else... 分支,變成一行。

   語法結構:

  表達式1  if  條件語句  else 表達式2    # 如條件成立執行 條件語句的左邊的表達式

案例1:需求: 讓用戶輸入用戶名,輸入的用戶若是不是tank,爲其後綴添加_DBD

username = input('請輸入用戶名:').strip()
new_username = username if username == 'tank' else username + '_DBD'
print(new_username)

 

4、列表生成式

01.生成列表的方法:

方法一:

new_list=[]

for i in range(1,101)

      new_list.append(i) 

print(new_list)

方法二:列表生成式:   [line for line in 可迭代對象]

list=[i for i in range(1,101)]

ps: list=[f'1{i}'  for i in range(1,101)]

ps:list=[1  for i in range(1,101)]

ps:list=['1' for i in range(1,101)]

ps:list=[i+'-dsb'  for i in range(1,101)]

ps:list=[i+'-dsb'  for i in range(1,101) if i!=4]      要看

 

5、生成器表達式(生成器生成式):(line for line in 可迭代對象)

g=(line for line in range(1,101))

print(g)

結果: 表示是生成器對象

<generator object <genexpr> at 0x0000000009E4A9E8>

 優勢:節省內存(一次只產生一個值在內存中)

區別:

 列表生成式:用在數據量少時。能夠依賴於索引取值,取值方便。在數據量過大時浪費資

 生成器生成式:用在數據量大時。不依賴於索引取值,取值麻煩。 在數據量過大時節省資源

 

6、匿名函數:無名字的函數。匿名函數是臨時的,一次性的。匿名函數主要是和其餘函數或內置函數搭配使用。單獨使用時須要把匿名函數賦值個變量,就變成有名字了,沒有什麼意義了。不要單獨用。

定義:

lambda 形參變量 :函數體

 

7、內置函數:python

01.求最大值的函數:  max()

list =[1,2,3,4]

print(max(list))

結果:4

02. 求最小值的函數: min( )

03. 求排序的函數sorted( )

04.求映射的函數map()

05.reduce()

06.filter

例子:請使用兩種方式獲取user_dic字典中薪資最高的員工。

user_dic = {'張全蛋': 20000,'趙鐵柱': 3000,'李小花': 8000,'伍六七': 1500}

方法一:
l1 =max(user_dic,key=lambda x:user_dic[x]) 
print(l1)

方法二:
l2 = sorted(user_dic, key=lambda x:user_dic[x])                    #升序
print(l2[-1])

#按降序排

l3 = sorted(user_dic, key=lambda x:user_dic[x],], reverse=True) #降序 print(l3)

 

 

 

 例子:map: 映射.(獲得的是一個map對象)

格式:map(函數地址, 可迭代對象) ---> map對象
做用:map會將可迭代對象中的每個值進行修改,而後映射一個map對象中,
能夠再將map對象轉換成列表/元組。
注意: 只能轉一次。

 

name_list = ['egon', 'jason', 'sean', '大餅', 'tank']
map_obj = map(lambda name: name + '喜歡吃生蠔' if name == 'tank' else name + 'DJB', name_list)
print(map_obj)            # map_obj ---> list/tuple
print(list(map_obj))      # map_obj ---> 生成器(迭代器) ---> 用完後,不能再取了
print(tuple(map_obj))

結果:


<map object at 0x0000000009E97588>
['egonDJB', 'jasonDJB', 'seanDJB', '大餅DJB', 'tank喜歡吃生蠔']
()

 

例子:reduce: 合併 .使用時須要導入functools模塊,返回的是一個值

格式:reduce(函數地址, 可迭代對象, 默認爲0)
格式:reduce(函數地址, 可迭代對象, 初始值)

做用:每次從可迭代對象中獲取兩個值進行合併。初始值: 執行reduce函數時,都是從初始值開始合併

eg:求1到100的和

#方法一:
sum=0
for i in range(1,101):
    sum+=i
print(sum)
#方法二:
from functools import reduce                    #從functools中導入 reduce
res =reduce(lambda x,y:x+y, range(1,101),0)     #x ,y 是變量。每次x+y的值都會再次賦值給x , 在從range中取出新的值再次賦值給y
rint(res)

 

例子:filter: 過濾  (獲得的結果是filter對象)

格式:filter(函數地址, 可迭代對象) --> filter 對象

做用:將可迭代對象遍歷,而後經過判斷,再將filter對象轉換成列表/元組。
注意: 只能轉一次。

name_list = ['egon_dsb', 'jason_dsb','sean_dsb', '大餅_dsb', 'tank']
filter_obj = filter(lambda name: name.endswith('_dsb'), name_list)
print(filter_obj)
print(list(filter_obj))
print(tuple(filter_obj))

結果:

<filter object at 0x0000000002876A20>['egon_dsb', 'jason_dsb', 'sean_dsb', '大餅_dsb']()

相關文章
相關標籤/搜索