虽然我已经写过,但我不知道为什么它有效,或为什么它有效。
>>> x = (lambda : [(yield 1), (yield 2)])()
>>> next(x)
1
>>> next(x)
2
>>> next(x)
StopIteration
答案 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语法。然而,这并不是很有用。