gpt4 book ai didi

python - 什么时候使用 return(产生一些东西)?

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

很长一段时间我都不知道你不能把return放在yield语句的前面。但实际上你可以:

def gen():
return (yield 42)

类似于

def gen():
yield 42
return

我能想到的唯一用法是将发送的值附加到 StopIteration:pep-0380

return expr in a generator causes StopIteration(expr) to be raised upon exit from the generator.

def gen():
return (yield 42)

g = gen()
print(next(g)) # 42
try:
g.send('AAAA')
except StopIteration as e:
print(e.value) # 'AAAA'

但这也可以使用额外的变量来完成,这更明确:

def gen():
a = yield 42
return a

g = gen()
print(next(g))
try:
g.send('AAAA')
except StopIteration as e:
print(e.value) # 'AAAA'

所以看起来 return (yield xxx) 只是一个语法糖。我错过了什么吗?

最佳答案

在生成器中,表达式(yield 42)将产生值 42,但如果使用 next(generator),它也会返回一个值为 None 的值。如果您使用 generator.send(value),则为给定值.

正如您所说,您可以使用中间值来获得相同的行为,不是因为这是语法糖,而是因为 yield 表达式实际上是返回您发送的值。

你同样可以做类似的事情

def my_generator():
return (yield (yield 42) + 10)

如果我们调用它,使用调用序列:

g = my_generator()
print(next(g))
try:
print('first response:', g.send(1))
print('Second response:', g.send(22))
print('third response:', g.send(3))
except StopIteration as e:
print('stopped at', e.value)

首先我们得到 42 的输出,生成器基本上暂停在您可以描述的状态:return (yield <Input will go here> + 10) ,如果我们再调用g.send(1)我们得到输出 11。生成器现在处于以下状态: return <Input will go here> ,然后发送g.send(22)将抛出 StopIteration(22) ,因为在生成器中处理返回的方式。因此,由于异常,您永远不会到达第三次发送。

我希望这个例子能让 yield在生成器中工作以及为什么语法 return (yield something)没有什么特别或异国情调,完全按照您的预期工作。

至于字面上的问题,你什么时候会这样做?好吧,当你想产生一些东西时,然后返回一个 StopIteration 回显用户发送到生成器的输入。因为这就是代码所说的字面意思。我希望这种行为很少需要。

关于python - 什么时候使用 return(产生一些东西)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42184576/

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