建立生成器的方法:python
1.經過生成器函數 ( yield)函數
2.生成器表達式spa
def func1(x): sum = 0 for i in range(1,x): x += 1 yield x g = func1(6) #生成器函數對
print(g) # <generator object func1 at 0x0000025E5D618780> #表示這是一個迭代器
print(g.__next__()) #一個next對應一個yield
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__()) #7 8 9 10 11
#yiedld 將值返回給生成器對象.__next__()
yield 的做用:1.一個next對應一個yieldcode
2.yield將值返回給生成器對象.__next__()對象
return的做用是結束函數,給函數的執行者返回值blog
yield 不會結束函數,一個next對應一個yield,給__next__()返回值內存
區別1:自定製的區別generator
l1 = [1,2,4] l2 = l1.__iter__() def func1(x): x += 1 yield x x += 2 yield x x += 3 yield x g = func1(5) print(g.__next__()) print(g.__next__())
區別2:內存級別的區別it
迭代器是須要將可迭代對象進行轉化,可迭代對象很是佔內存class
生成器是直接建立,不須要轉化,從本質上就節省內存
send與nxet同樣,也是對生成器取值(執行一個yield)的方法
send 能夠給上一個yield 進行傳值
第一次取值永遠都是next
最後一個yield 永遠也得不到send傳的值
循環模式 :[變量(加工後的變量) for 變量 in iterable(可迭代對象)]
l1 = [i for i in range(1,10)] print(l1) #[1, 2, 3, 4, 5, 6, 7, 8, 9]
篩選模式 :[變量(加工後的變量)for 變量 in iterable(可迭代對象)if 條件]
l2 = [i for i in range(1,10) if i%2 ==0] print(l2) #[2, 4, 6, 8]
列表推導式優勢:一行解決,方便
缺點:容易着迷,不易拍錯,不能超過三次循環
列表推導式不能解決全部的列表的問題,全部不要太刻意使用
l1 = ( i for i in range(1,1000000)) print(l1.__next__()) #1 print(l1.__next__()) #2 print(l1.__next__()) print(l1.__next__()) print(l1.__next__()) #5 #能夠經過循環打印必定數量的取值
mcase = {"a":10,"b":35} mcase_frequency = {mcase[k]:k for k in mcase} print(mcase_frequency) #{10: 'a', 35: 'b'}
sq = {x**2 for x in range(-5,6)} print(sq) #{0, 1, 4, 9, 16, 25} #自帶去重功能