初始:将yield看作是return
重点:
1)带有yield的函数是生成器,不会像list一样占用大量内存,使用iterator迭代,python3中的range已经是range而不是一个list
2)就下面代码来看g=foo()并不会打印任何东西,而是先得到一个generator,类似实例化
3)直到generator的next/send方法,执行到yield sakura相当于程序结束,并没有走到打印res
4)再次执行next(g)并不是从foo函数头开始,而是上次程序停止的地方执行,但由于上次运行已经return sakura,所以print(res)的结果为None,程序继续循环while,直到yield 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)
作用二:大文件读取,如果直接对文件对象调用 read() 方法,会导致不可预测的内存占用,好的方法是利用固定长度的缓冲区来不断读取文件内容(这个是简写/复杂需要考虑换行,加缓存)
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
斐波那契数列
def foo(max):
n, a, b = 0, 0, 1
while n < max:
print(b)
a, b = b, a+b
n += 1
print(foo(100))