程序媛

7.31分享——生成器的yield from

yield from是Python3.3新出现的句法。

如果生成器函数需要产出两个可迭代对象的值,传统的解决方法是需要使用多个for循环:

def gen1():
    for c in 'AB':
        yield c
    for i in range(3):
        yield i

print(list(gen1()))

yield from 完全代替 for 循环。

yield from x 表达式对 x 对象所做的第一件事是,调用 iter(x),从中获取迭代器。因此,x 可以是任何可迭代的对象。

在这个示例中使用 yield from代码读起来会更顺畅,写起来也非常便捷。

def gen2():
    yield from 'AB'
    yield from range(3)

print(list(gen2()))

非常专业的术语大家现在看起来还不太明白,是因为很多概念和知识点还没有完全学到,但是我们仍然可以通过执行代码发现上下两段代码做的事情是完全一样的。

那么你也应该可以大致的体会到yield from的作用了。

这是一个非常强大的功能,python中利用yield from的底层原理实现了很多python奇技,甚至web框架,大家早些接触这个python3.3之后才出现的新语法吧。

再看看yield from的用法:

def generator1():
    yield 1
    yield 2
    yield 3
    yield 4
    yield 5
def generator2():
    yield 'a'
    yield 'b'
    yield 'c'
    yield from generator1() 
    yield from [11,22,33,44]
    yield from (12,23,34)
    yield from range(3)

def generator1():
    yield 1
    yield 2
    yield 3
    yield 4
    yield 5
def generator2():
    yield 'a'
    yield 'b'
    yield 'c'
    yield from generator1()
    yield from [11,22,33,44]
    yield from (12,23,34)
    yield from range(3)

print(list(generator2()))

# 结果:
# ['a', 'b', 'c', 1, 2, 3, 4, 5, 11, 22, 33, 44, 12, 23, 34, 0, 1, 2]

 

posted @ 2019-07-31 20:31  Eva_J  阅读(200)  评论(0)    收藏  举报