1, 生成器的本質就是迭代器python
生成器的三種建立辦法: (1):經過生成器函數建立 (2)經過生成器表達式建立生成器 (3) 經過數據轉換架構
2,各類推倒式和生成器表達式:函數
(1): 列表推倒式 如: lis = [結果 for 變量 in 可迭代對象 if 篩選]spa
lst = ['python%s' % i for i in range(1,15)] print(lst) 對象
lst = [i for i in range(1, 100) if i % 2 == 0 print(lst) 內存
生成器表達式和列表相似: 如: gen = (i for i in range(10)) print(gen) =====> <generator object <genexpr> at 0x106768f10>generator
gen = (i for i in range(1,100) if i % 3 == 0) 生成器表達式能夠直接獲取到生成器. 生成器能夠直接進行for循環. 生成器具備惰性機制for循環
for num in gen: ======>print(num)變量
區別: 一樣一籃子雞蛋. 列表推導式: 直接拿到一籃子雞蛋. 生成器表達式: 拿到一個老母雞. 須要雞蛋就給你下雞蛋.
object
獲得的值不同. 列表推導式獲得的是一個列表. 生成器表達式獲取的是一個生成器. 列表推導式耗內存,生成器表達式獲取的是一個生成器
(2): 字典推倒式 如: {結果 for 變量 in 可迭代對象 if 篩選} 結果=>key:value
lst1 = ['jay', 'jj', 'sylar'] lst2 = ['周杰倫', '林林俊傑', '邱彥濤'] dic = {lst1[i]: lst2[i] for i in range(len(lst1))} print(dic)
dic = {'a': 1, 'b': '2'} new_dic = {dic[key]: key for key in dic} print(new_dic)
(3): 集合推導式 ( 集合推導式自帶去重功能) 注意abs是個內置函數取絕對值的命令,不管正負只取值
如: lst = [1, -1, 8, -8, 12] s = {abs(i) for i in lst} print(s)
(4): 生成器函數
def eat():
print("我吃什什麼啊") 注意: yield是分段來執行一個函數,區別於列表推導式優勢是節省內存(高價架構師方向)
a = yield "饅頭" send和next()都是讓生成器向下走一次, send能夠給上一個yield的位置傳遞值
print("a=",a) send不能給最後一個yield發送值. 在第一次執行生成器代碼的時候不能使用send()
b = yield "大餅"
print("b=",b)
c = yield "韭菜盒子"
print("c=",c)
yield "GAME OVER" 當程序運行完最後一個yield. 那麼後面繼續進行__next__()程序會報錯
gen = eat() # 獲取生成器 ret1 = gen.__next__() print(ret1) ret2 = gen.send("胡辣湯") =====> 將 '胡辣湯' 賦值給a print(ret2) ret3 = gen.send("狗糧") =====> 將 '狗糧' 賦值給a print(ret3) ret4 = gen.send("貓糧") =====> 將 '貓糧' 賦值給a print(ret4)