学过python的朋友大概都知道yield的用法
简单来说yield就是返回一个生成器
而yield from则是返回子例程
yield from iterable本质上等于for item in iterable: yield item的缩写版
具体我们可以看一个例子
def flatten(items, ignore_types=(str, bytes)):
for x in items:
if isinstance(x, Iterable) and not isinstance(x, ignore_types):
yield from flatten(x)
else:
yield x
这个函数是解开嵌套序列并输出值
items = [1, 2, [3, 4, [5, 6], 7], 8]
for x in flatten(items):
print(x)
1 2 3 4 5 6 7 8
它就是利用yield from来解开嵌套循环
首先isinstance是来检查类的,我们使用isinstance来检测x是不是可迭代的,并且防止是字符串或bytes类型,防止输出一个个的字符
yield from是返回所有子例程的的值
最后就是一个没有嵌套的序列了
如果还不明白可以再看一个小例子
items = [1, 2, [3, 4, [5, 6], 7], 8]
def xxx(items):
yield from items
for a in xxx(items):
print(a, end=' ')
1 2 [3, 4, [5, 6], 7] 8
这是经过一次yield from后的值,里面是不是还有迭代对象?所以我们的flatten函数就是利用递归,再把这个可迭代对象传进进行yield from,直至无可迭代对象后,所有值都被返回到x这个生成器
最后利用for循环我们就可以打印出所有值