列表

时间:2018-03-15 23:45:47

标签: python python-3.x generator yield

当我突然写下这段代码时,我正在玩生成器。

虽然我已经写过,但我不知道为什么它有效,或为什么它有效。

>>> x = (lambda : [(yield 1), (yield 2)])()
>>> next(x)
1
>>> next(x)
2
>>> next(x)
StopIteration

1 个答案:

答案 0 :(得分:3)

您使用lambda语法创建了一个生成器函数。 yield只是另一个表达式,因此可以在lambda中使用。

你基本上是这样做的:

def foo():
    return [(yield 1), (yield 2)]

x = foo()

但是只有一个表达式。

两个yield表达式都返回None,因此StopIteration结果值设置为[None, None]

>>> x = (lambda : [(yield 1), (yield 2)])()
>>> next(x), next(x)
(1, 2)
>>> try:
...     next(x)
... except StopIteration as si:
...     print(si.value)
...
[None, None]

您可以使用next()取代generator.send()以外的yield以外的其他内容,而不是使用None

>>> x = (lambda : [(yield 1), (yield 2)])()
>>> next(x)  # advance to first yield
1
>>> x.send(42)   # set return value for first yield, continue to second
2
>>> try:
...     x.send(81)   # set return value for second yield
... except StopIteration as si:
...     print(si.value)
...
[42, 81]

它有效,因为它是合法的Python语法。然而,这并不是很有用。