python3生成器
阿新 • • 發佈:2019-05-11
__next__ 列表推導式 不能 循環 python3 none *** 報錯 []
一、生成器函數
1.yield關鍵字
定義:含義yield關鍵字的函數,是生成器函數
作用:返回值,不終止函數,若yield後無值,則返回None
用法:與return關鍵字不能共存,必須在函數內部
2.調用函數
調用生成器函數返回的是生成器
3.常用方法
1)__next__()
格式:生成器.__next__()
作用:執行生成器函數內部代碼,遇到yeild關鍵字停止,並返回值,若沒有yield作為結尾,會報錯
# 生成器函數 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) # 格式化輸出
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)
python3生成器