初始:將yield看作是return
重點(diǎn):
1)帶有yield的函數(shù)是生成器,不會(huì)像list一樣占用大量?jī)?nèi)存,使用iterator迭代,python3中的range已經(jīng)是range而不是一個(gè)list
2)就下面代碼來(lái)看g=foo()并不會(huì)打印任何東西,而是先得到一個(gè)generator,類(lèi)似實(shí)例化
3)直到generator的next/send方法,執(zhí)行到y(tǒng)ield sakura相當(dāng)于程序結(jié)束,并沒(méi)有走到打印res
4)再次執(zhí)行next(g)并不是從foo函數(shù)頭開(kāi)始,而是上次程序停止的地方執(zhí)行,但由于上次運(yùn)行已經(jīng)return sakura,所以print(res)的結(jié)果為None,程序繼續(xù)循環(huán)while,直到y(tǒng)ield sakura
def foo():
print('starting....')
while True:
res = yield sakura
print(res)
g = foo()
print(next(g))
print("*"*20)
print(next(g))
>>> sakura
>>> ********************
>>> None
>>> sakura
作用一:使用yield生成range
def foo(num):
while num < 10:
num+=1
yield num
for n in foo(0):
print(n)
作用二:大文件讀取,如果直接對(duì)文件對(duì)象調(diào)用 read() 方法,會(huì)導(dǎo)致不可預(yù)測(cè)的內(nèi)存占用,好的方法是利用固定長(zhǎng)度的緩沖區(qū)來(lái)不斷讀取文件內(nèi)容(這個(gè)是簡(jiǎn)寫(xiě)/復(fù)雜需要考慮換行,加緩存)
def read_file(dir_path):
BLOCK_SIZE = 1024
with open(dir_path,'rb') as f:
while True:
block = f.read(BLOCK_SIZE)
if block:
yiled block
else:
return
斐波那契數(shù)列
def foo(max):
n, a, b = 0, 0, 1
while n < max:
print(b)
a, b = b, a+b
n += 1
print(foo(100))