浅析yield from

学过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循环我们就可以打印出所有值

猜你喜欢

转载自blog.csdn.net/weixin_44106928/article/details/89386936
今日推荐