生成器 yield
函数使用 yield 后,就像在yidle处打了断点一样,然后将函数挂起,等待下一次触发执行.
表达式
先看一个生成器表达式
# 对i进行平方,生成一个可迭代的对象
>>> res = (i**2 for i in range(7))
# 这个可迭代对象, 可以转为 列表
>>> returnToList = list(res)
# 可以逐一输出这个对象中的值
>>> res.__next__()
>>> res.__next__()
>>> res.__next__()
>>> res.__next__()
# 还可以使用for进行遍历
>>> for k in res:
print (k)
yield 使用在函数内部, 生成一个可迭代的对象,调用一次__next__(),输出一次值
>>> def yFun(n):
for i in range(n):
yield i
>>> res = yFun(5)
>>> res.__next__()
>>>> res.__next__()
递归
aList = ["cat","dog",["cow","duck"],"snake",[["horse","monkey","chicken",["pig","mouse"]]]]
def yRecursion(aList):
try:
try: aList+" "
except TypeError: pass
else: raise TypeError
for i in aList:
for j in yRecuesion(i):
yield j
except TypeError :
yeild aList
文件读取
如果直接对文件对象调用 read() 方法,会导致不可预测的内存占用。好的方法是利用固定长度的缓冲区来不断读取文件内容。通过 yield,我们不再需要编写读文件的迭代类,就可以轻松实现文件读取:
def read_file(fpath):
BLOCK_SIZE = 1024
with open(fpath, 'rb') as f:
while True:
block = f.read(BLOCK_SIZE)
if block:
yield block
else:
return