一.生成器python
什麼是生成器,生成器的實質就是迭代器app
在python中有三種方式來獲取生成器:函數
1.經過生成器函數spa
2.經過各類推導式來實現生成器code
3.經過數據的轉換也能夠獲取生成器對象
1 def func() 2 print("111") 3 yield 222 4 ret = func() 5 print(ret) 6 7 結果: 8 <generator object func at 0x10567ff68>
send方法和__next__()blog
send和__next__()同樣均可以讓生成器執行到下一個yield.內存
1 def eat(): 2 print("我吃什麼啊") 3 a = yield "饅頭" 4 print("a=",a) 5 b = yield "大餅" 6 print("b=",b) 7 c = yield "韭菜盒子" 8 print("c=",c) 9 yield "GAME OVER" 10 gen = eat() # 獲取生成器器 11 ret1 = gen.__next__() 12 print(ret1) 13 ret2 = gen.send("胡辣湯") 14 print(ret2) 15 ret3 = gen.send("狗糧") 16 print(ret3) 17 ret4 = gen.send("貓糧") 18 print(ret4)
send和__next__() 的區別:generator
1.send和next()都是讓生成器向下走一次for循環
2.send能夠讓上一個yield的位置傳遞值,不能給最後一個yield發送值,在第一次執行生成器代碼的時候不能用send()
生成器能夠使用for循環來獲取內部元素:
1 def func(): 2 print(111) 3 yield 222 4 print(333) 5 yield 444 6 print(555) 7 yield 666 8 gen = func() 9 for i in gen: 10 print(i) 11 12 13 結果: 14 111 15 222 16 333 17 444 18 555 19 666
二.列表推導式,生成器表達式以及其餘推導式
首先給出以下代碼
1 lst = [] 2 for i in range(1,15) 3 lst.append(i) 4 print(lst)
替換成列表推導式:
1 lst = [i for i in range(1,15)] 2 print(lst)
語法:
[結果 for 變量 in 可迭代對象 if 條件]
列表推導式可對結果進行篩選:
1 lst = [i for i in range(1,15) if i%2 ==0] 2 print(lst)
生成器表達式與列表推導式的語法是一致的,只是把[]替換成了()
1 gen = (i for i in range(1,15)) 2 print(gen) 3 4 結果: 5 <generator object <genexpr> at 0x106768f10>
打印的結果是一個生成器,咱們能夠經過for循環來循環這個生成器:
1 gen = (i for i in range(10)) 2 for i in gen: 3 print(i)
生成器表達式一樣能夠進行篩選:
1 #獲取1-100內能被3整除的數 2 gen = (i for i in range(1,100) if i %3 == 0) 3 4 for num in gen: 5 print(num)
生成器表達式和列表推導式的區別:
1.列表推導式比較耗內存,一次性加載,生成器表達式幾乎不佔用內存,使用的時候採配合使用內存
2.獲得的值不同,列表推導式獲得的是一個列表,生成器表達式獲取的是一個生成器.
生成器的惰性機制:
1 def func() 2 print("111") 3 yield 222 4 5 g = func() #生成器g 6 g1 = (i for i in g) #生成器g1,可是生成器的數據來源於g 7 g2 = (i for i in g1) #生成器g2,來源於g1 8 9 print(list(g)) #獲取g中的數據,這時func()纔會被執行,打印,獲取到222,g完畢 10 print(list(g1)) #獲取g1中的數據,g1的數據來源於g,可是g已經取完,g1也沒有數據 11 print(list(g2)) #與g1同理
字典推導式:
1 # 把字典中的key和value互換 2 dic = {'a': 1, 'b': '2'} 3 new_dic = {dic[key]: key for key in dic} 4 print(new_dic) 5 6 # 在如下list中. 從lst1中獲取的數據和lst2中相對應的位置的數據組成一個新字典 7 lst1 = ['jay', 'jj', 'sylar'] 8 lst2 = ['周杰倫', '林俊杰', '邱彥濤'] 9 dic = {lst1[i]: lst2[i] for i in range(len(lst1))} 10 print(dic)
集合推導式:
集合推導式能夠幫咱們直接生成一個集合,集合的特色:無序,不重複,因此集合推導式自帶去重功能
1 lst = [1, -1, 8, -8, 12] 2 # 絕對值去重 3 s = {abs(i) for i in lst} 4 print(s)
生成器表達式:
1 def add(a, b): 2 return a + b 3 4 def test(): 5 for r_i in range(4): 6 yield r_i 7 g = test() 8 9 for n in [2, 10]: 10 g = (add(n, i) for i in g) 11 12 print(list(g))
結果:
[20,21,22,23]
生成器的惰性機制