yield 和 yield from

发布时间 2023-07-28 15:41:57作者: 灵火

在测试的时候,发现了一段挺有意思的 code block.

def g2(iter):
	yield from iter

def g1(iter):
	yield iter
 
def out(ar):
    for i in ar:
        print(i)

dit= {
    "a": 1,
    "b": 2,
    "c": 3,
    "d": 4,
    "e": 5,
}

out(g1(dit))
out(g2(dit))
out(g2(g1(dit)))
print(next(g2(g1(dit))))

# 输出如下:
# {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
# a
# b
# c
# d
# e
# {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
# {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}

在这段代码片段中,有意思的是 g2(g1()) 中:

g1 返回一个 generator 对象;
g2 迭代 g1 的 generator 对象,最后返回原来的值,可以使用 next() 获取 generator 对象的下一个值。