1.yield關鍵字函數
定義:含義yield關鍵字的函數,是生成器函數spa
做用:返回值,不終止函數,若yield後無值,則返回Nonecode
用法:與return關鍵字不能共存,必須在函數內部orm
2.調用函數協程
調用生成器函數返回的是生成器對象
3.經常使用方法blog
1)__next__()內存
格式:生成器.__next__()generator
做用:執行生成器函數內部代碼,遇到yeild關鍵字中止,並返回值,若沒有yield做爲結尾,會報錯it
# 生成器函數 def generator(): print(1) yield 'a' print(2) yield 'c' g = generator() # g是生成器 print(g) ret = g.__next__() # 執行生成器函數內部代碼直到遇到yield print(ret)
2)for循環
做用:執行生成器內部代碼,結尾不是yield關鍵字,不會報錯
# 生成器函數 def generator(): print(1) yield 'a' print(2) yield 'c' g = generator() # g是生成器 for i in g: print(i)
3)send()
格式:send(傳遞的數據)
做用:執行下面的代碼,給上一個yield位置傳遞數據
注意:不能在初始使用send()方法
def generator(): print(1) count = yield 'a' print(count) print(2) yield 'c' g = generator() # g是生成器 ret1 = g.__next__() print('>>>{}'.format(ret1)) # str格式輸出 format # g.__next__() ret2 = g.send('a123') print('***%s' % ret2) # 格式化輸出
# 預激協程,求平均值 def init(func): def inner(*args, **kwargs): g = func(*args, **kwargs) next(g) # g.__next__() 同樣 return g return inner @init def average(): total = 0 count = 0 average = None while True: term = yield average total += term count += 1 average = total/count av = average() av1 = av.send(10) av2 = av.send(20) av3 = av.send(30) print(av3)
4)yield from
做用:簡化代碼
格式:yield from 可迭代對象
def generator(): # for i in range(10): # yield i yield from range(10) # 和for循環的做用同樣 g = generator() for i in g: print(i)
1.格式:生成器 = (爲True操做 for i in 可迭代對象 if 條件)
2.分類
遍歷
篩選
# 遍歷,1-10 g = (i for i in range(1, 11)) for i in g: print(i)
# 篩選 g = (i**2 for i in range(10) if i > 5) for i in g: print(i)
1.列表推導式
# 遍歷,1-10 li1 = [i for i in range(1, 11)] print(li1) # 篩選 li2 = [i**2 for i in range(10) if i > 5] print(li2)
列表推導式和生成器表達式的區別:
1)格式:列表推導式[],生成器表達式()
2)內存消耗:生成器表達式消耗內存少
2.字典推導式
# 把value值變成大寫 dic = {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'} dic1 = {k: dic[k].upper() for k in dic} print(dic1) # 篩選 dic2 = {k: dic[k] for k in dic if dic[k] == 'v3'} print(dic2)
3.集合推導式
# 遍歷 set1 = {-1, 1, -2, 2} set2 = {i**2 for i in set1} # 集合,去重 print(set2) # 篩選 set3 = {i*i for i in set1 if i == 2} print(set3)
1.生成器的本質是迭代器
2.yield關鍵字
做用:返回值
3.調用生成器函數得到的值是生成器
4.生成器函數的方法:
__next__(),執行生成器函數內部代碼,直到遇到yield
for循環
send(),取值,傳遞數據給上一個yield位置
yield from,可迭代,返回值,不是總體
5.生成器表達式,獲取的是生成器
6.生成器取值,next方法,for循環,數據類型的強轉(生成器->list),send
7.一個生成器裏的值,只能取一次,並且不找它要的時候,它是不會取的
def demo(): for i in range(4): yield i g = demo() g1 = (i for i in g) g2 = (i for i in g1) print(list(g1)) print(list(g2))