生成器和生成器表達式
阿新 • • 發佈:2018-09-18
使用 __next__ app 下一個 pre 列表推導 list func 難度
什麽是生成器?
def func(): print("含有yield的是生成器") yield 10#返回值 ret=func()#函數並不執行 而是記錄代碼 print(ret)#當使用到函數時 開始執行 獲取到的是生成器 #生成器和叠代器類似,可以使用__next__來獲取到下一個值
例如
def func(): print("111") yield 222 gen=func() ret=gen.__next__() print(ret) 》》》111 222
列表推導式
取1-100的奇數
lst=[i for i in range(1,101) ifi%2==1] print(lst)
對比之前的想法
lst=[] for i in range(1,101): if i %2==1: lst.append(i) print(lst)
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49, 51, 53, 55, 57, 59, 61, 63, 65, 67, 69, 71, 73, 75, 77, 79, 81, 83, 85, 87, 89, 91, 93, 95, 97, 99]
字典推導式
lst1=["東北","山西","山東"] lst2=["大亂燉","老陳醋","大餅"] dic={lst1[i]:lst2[i] for i in range(len(lst1))} print(dic)
一個面試題. 難度系數500000000顆星:
def add(a, b): return a + b def test(): for r_i in range(4): yield r_i g = test() for n in [2, 10]: g = (add(n, i) for i in g) print(list(g))
推導過程思路主要利用生成器的特性 不調用或者執行的時候不會給值
def add(a, b):#a+b return a + b def test():#0-3 for r_i in range(4): yield r_i g = test()#函數不執行,獲取到的是生成器 for n in [2, 10]:#這個循環獲取到列表中的兩個值,(巨坑開始) g = (add(n, i) for i in g) print(list(g))
把for循環拆開分析
n=2 g = (add(n, i) for i in g)#註意 這裏並不執行代碼 而是記錄代碼 n=10 g = (add(n, i) for i in g)#這裏的第二個g,已經替換成n=2時的g = (add(n, i) for i in g)
即
n=2 g = (add(n, i) for i in g)#註意 這裏並不執行代碼 而是記錄代碼 n=10 g = (add(n, i) for i in (add(n, i) for i in g))#這裏的第二個g,已經替換成n=2時的g = (add(n, i) for i in g)
即
def add(a, b):#a+b return a + b def test():#0-3 for r_i in range(4): yield r_i g = test()#函數不執行,獲取到的是生成器 n=10 g = (add(n, i) for i in (add(n, i) for i in g)) print(list(g))#函數開始執行
》》》[20, 21, 22, 23]
友情提示: 惰性機制, 不到最後不會拿值
這個題要先讀一下. 然後自己分析出結果. 最後用機器跑一下.
生成器和生成器表達式