列表生成式
a = [i+1 for i in range(10)]
print (a)
#a=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
生成器
生成器不需要?jiǎng)?chuàng)建整個(gè)列表,節(jié)省內(nèi)存;
generator保存的是算法,每次調(diào)用next(generator),就計(jì)算出generator的下一個(gè)元素的值,直到計(jì)算到最后一個(gè)元素,沒有更多的元素時(shí),拋出StopIteration的錯(cuò)誤。
也可以通過for函數(shù)訪問
a = (i+1 for i in range(10))
print (a)
#<generator object <genexpr> at 0x117116050>
print (next(a))
#1
for g in a:
print (g)
#1
#2
#3
...
#10
應(yīng)用:斐波那契數(shù)列
def fib(max):
n,a,b=0,0,1
while n<max:
yield b
a,b=b,b+a
n += 1
print (fib(6))
for i in (fib(6)):
print (i)
這就是定義generator的另一種方法。如果一個(gè)函數(shù)定義中包含yield關(guān)鍵字,那么這個(gè)函數(shù)就不再是一個(gè)普通函數(shù),而是一個(gè)generator:
函數(shù)是順序執(zhí)行,遇到return語句或者最后一行函數(shù)語句就返回。而變成generator的函數(shù),在每次調(diào)用next()的時(shí)候執(zhí)行,遇到y(tǒng)ield語句返回,再次執(zhí)行時(shí)從上次返回的yield語句處繼續(xù)執(zhí)行。