【问题标题】:"return" and "return None" behavior difference in generator [duplicate]生成器中的“return”和“return None”行为差异[重复]
【发布时间】:2020-05-20 07:47:20
【问题描述】:

仅使用 return 关键字的简单方法返回 None

def abc():
    return
print(abc())

输出:无

同样,

def abc():
    return None
print(abc())

输出:无

但是,如果我们在生成器中使用它

def abc():
    yield 1
    return None
print(abc())

它给了

SyntaxError: 'return' with argument inside generator

在哪里

def abc():
    yield 1
    return
print(abc())

给予

<generator object abc at 0x7f97d7052b40>

为什么我们的行为会有这种差异?

【问题讨论】:

  • 它明确指出带参数返回是语法错误。语法不检查也不关心参数是否为 None,SyntaxError 之前已经发生过。
  • @JanChristophTerasa - 这就是 OP 所要问的,为什么行为会有所不同
  • 您使用的似乎是旧版本的 Python。
  • 这能回答你的问题吗? Why can't I use yield with return?
  • This answer 值得一读

标签: python python-3.x generator


【解决方案1】:

一个裸露的return 对于提早脱离生成器很有用。

同时return None 只是return &lt;a value&gt; 的一个特例,在yield from (PEP 380) 之前没有支持或用例从生成器返回值。因此,为了让设计空间开放而被禁止:通过禁止在生成器中返回 ,Python 的设计者可以在以后使用新的语义来允许它,因为这不会破坏现有代码。

如果他们允许返回值而不对其进行任何操作,则会出现用户空间代码would break 的风险。这就是为什么从前向兼容性的角度来看,最好尽可能限制 API,让开放用户可以利用的所有内容,并且更改会变得有风险。

【讨论】:

  • 谢谢。现在它已受支持,您是否可以添加如何使用收益返回来克服您在之前的设计中陈述的问题?
  • 我不明白你的问题。以前的设计没有问题,只是没有任何用于从生成器返回值,所以禁止它。然后 PEP 380 为它添加了一个用例,因此允许了它。没有什么可克服的,原本禁止的形式允许以后以安全和向后兼容的方式启用它。
猜你喜欢
  • 2020-04-25
  • 2013-06-09
  • 2019-10-04
  • 1970-01-01
  • 2014-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多