gpt4 book ai didi

python - yield 中的 yield 有什么作用?

转载 作者:IT老高 更新时间:2023-10-28 20:24:58 28 4
gpt4 key购买 nike

考虑以下代码:

def mygen():
yield (yield 1)
a = mygen()
print(next(a))
print(next(a))

输出产量:

1
None

解释器在“外部”究竟做了什么?

最佳答案

a 是一个生成器对象。第一次调用 next 时,body 会被计算到第一个 yield 表达式(即第一个被计算的:内部)。 yieldnext 返回值 1,然后阻塞直到生成器的下一个条目。这是由第二次调用next 产生的,它 将任何值发送到 生成器。因此,第一个(内部)yield 的计算结果为 None。该值用作外部 yield 的参数,它成为第二次调用 next 的返回值。如果你要第三次调用 next,你会得到一个 StopIteration 异常。

比较使用send方法(而不是next)来改变第一个yield表达式的返回值。

>>> a = mygen()
>>> next(a)
1
>>> a.send(3) # instead of next(a)
3
>>> next(a)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration

编写生成器的更明确的方式是

def mygen():
x = yield 1
yield x

a = mygen()
print(a.send(None)) # outputs 1, from yield 1
print(a.send(5)) # makes yield 1 == 5, then gets 5 back from yield x
print(a.send(3)) # Raises StopIteration, as there's nothing after yield x

在 Python 2.5 之前,yield statement 提供了调用者和生成器之间的单向通信;对 next 的调用将执行生成器直到下一个 yield 语句,并且 yield 关键字提供的值将用作返回值下一个。发电机也会在 yield 语句处暂停,等待对 next 的下一次调用恢复。

在 Python 2.5 中,yield 语句被替换*为 yield expression,并且生成器获得了 send 方法。 send 的工作方式与 next 非常相似,只是它可以接受一个参数。 (对于其余部分,假设 next(a) 等价于 a.send(None)。)在调用 send 后生成器开始执行(无),此时它执行到第一个yield,它像以前一样返回一个值。然而,现在,表达式阻塞,直到 next 调用 send,此时 yield 表达式计算为传递给 的参数发送。生成器现在可以在恢复时接收一个值。


* 没有完全替换; kojiro 的回答更详细地介绍了 yield 语句和 yield 表达式之间的细微差别。

关于python - yield 中的 yield 有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55922302/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com