檔案上傳並返回檢視地址
阿新 • • 發佈:2022-05-19
目錄
生成器
一.生成器物件
1.本質
還是內建有__iter__和__next__的迭代器物件
2.區別
迭代器物件是直譯器自動提供的
資料型別\檔案物件>>>:迭代器物件
生成器物件是程式設計師編寫出來的
程式碼、關鍵字>>>:迭代器物件(生成器)
3.建立生成器的基本語法
函式體程式碼中填寫yield關鍵字
def my_iter(): print('全是科技與狠活兒啊,鐵汁') yield '''1.函式體程式碼中如果有yield關鍵字 那麼函式名加括號並不會執行函式體程式碼,而是會生成一個生成器物件(迭代器物件)''' res = my_iter() '''2.使用加括號之後的結果呼叫__next__才會執行函式體程式碼''' res.__next__() '''3.每次執行完__next__程式碼都會停在yield位置 下次基於該位置繼續往下尋找第二個yield''' def my_iter(): print('我一勺三花淡奶') yield 111, 222, 333 print('我一勺十里香') yield 111, 222, 333 print('千萬別整多了了鐵汁,整多倒沫子了') yield 111, 222, 333 print('都是科技與狠活啊鐵汁,頭髮掉光光') yield 111, 222, 333 res = my_iter() r1 = res.__next__() print(r1) r2 = res.__next__() print(r2) r3 = res.__next__() print(r3) r4 = res.__next__() print(r4) '''4.yield還有點類似於return 可以返回返回值'''
4.練習
自定義生成器對標range功能(一個引數 兩個引數 三個引數 迭代器物件)
for i in range(1, 10): print(i) # 1.先寫兩個引數的 # 2.再寫一個引數的 # 3.最後寫三個引數 def my_range(start_num, end_num=None, step=1): # 判斷end_num是否有值 沒有值說明使用者只給了一個值 起始數字應該是0 終止位置應該是傳的值 if not end_num: end_num = start_num start_num = 0 while start_num < end_num: yield start_num start_num += step res = my_range(1, 10).__iter__() while True: try: i = res.__next__() # for i in range(1, 10):print(i) print(i) except StopIteration: break for i in my_range(100): print(i) for i in my_range(1, 10): print(i) for i in my_range(10): print(i) for i in my_range(100, 50, -1): print(i) for i in range(100, 50, -1): print(i)
5.yield冷門用法
def eat(name, food=None): print(f'{name}準備用餐') while True: food = yield printf(f'{name}正在吃{food}') res = eat('jason') res.__next__() res.send('漢堡') '''1.將括號內的資料傳給yield前面的變數名 2.再自動呼叫__next__''' res.send('薯條') res.send('雞翅') ----------------------------- jason準備用餐 jason正在吃漢堡 jason正在吃薯條 jason正在吃雞翅
二.生成器表示式
說白了就是生成器表示式
l1 = [i ** 2 for i in range(100)]
print(11)
l1 = (i ** 2 for i in range(100)) # 生成器物件
print(l1) # <generator object <genexpr> at 0x000001DFC07F7E40>
for i in l1
print(i)
面試題(有難度)
def add(n, i): # 普通函式 返回兩個數的和求物件
return n + i
def test(): # 生成器
for i in range(4):
yield i
g = test() # 啟用生成器
for n in [1, 10]:
g = (add(n, i) for i in g)
"""
第一次for迴圈 g = (add(n, i) for i in g) 這裡相當於給g重新綁定了一個生成器沒有執行程式碼
第二次for迴圈 g = (add(10, i) for i in (add(10, i) for i in g))
這裡就相當於用到for迴圈去(add(n, i) for i in g)裡面取值了,這個時候n是10,生成器給的四個值是0、1、2、3,然後執行add就等於c選項
"""
res = list(g)
print(res)
#A. res=[10,11,12,13]
#B. res=[11,12,13,14]
#C. res=[20,21,22,23]
#D. res=[21,22,23,24]