Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 何时使用退货(退货)?_Python_Generator - Fatal编程技术网

Python 何时使用退货(退货)?

Python 何时使用退货(退货)?,python,generator,Python,Generator,很长一段时间我都不知道你不能把return放在收益率声明前面。但实际上你可以: def gen(): return (yield 42) 类似于 def gen(): yield 42 return 我能想到的唯一用法是将发送值附加到StopIteration: 生成器中的return expr导致引发StopIteration(expr) 从发电机中退出时 但这也可以通过使用一个额外的变量来实现,这个变量更明确: def gen(): a = yield 4

很长一段时间我都不知道你不能把
return
放在收益率声明前面。但实际上你可以:

def gen():
    return (yield 42)
类似于

def gen():
    yield 42
    return
我能想到的唯一用法是将发送值附加到
StopIteration

生成器中的return expr导致引发StopIteration(expr) 从发电机中退出时


但这也可以通过使用一个额外的变量来实现,这个变量更明确:

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)
,它也会返回一个无值,或者如果使用
generator.send(value)
,则返回一个给定值

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

你也可以做类似的事情

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+10)
, 如果我们随后调用
g.send(1)
,我们将得到输出11。发电机现在处于以下状态:
return
,然后发送
g.send(22)
将抛出一个
StopIteration(22)
,这是因为在生成器中处理返回的方式。 因此,由于异常,您永远无法进行第三次发送

我希望这个例子能让我们更清楚地了解
yield
是如何在生成器中工作的,以及为什么
return(yield something)
语法没有什么特别或奇异之处,它的工作方式与您的预期完全一致


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

“但这也可以使用一个额外的变量来完成,这更为明确”-您可以这样说任何
return
语句<代码>返回x+y变为
z=x+y;返回z
<代码>返回foo()变成
x=foo();返回x
。这里没有任何特定于
返回(产生任何结果)
的参数;这就是从表达式值产生的
实现方式。它是API的一个已发布部分,但通常不是一个有趣的部分。如果我做了类似于
x=(收益率42)
的事情,然后
收益率x+10
,使用
g.send
,似乎
x
变成了
None
,这是预期的吗?为什么
x
没有成为我传递给
send
的内容?@juanpa.arrivillaga很抱歉,但是你必须发布一些代码来说明你在做什么。用正确的方式拼凑你正在写的东西会得到预期的结果,所以很可能你没有正确地拼凑,因为它对你不起作用。
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)