【发布时间】:2018-05-15 15:01:27
【问题描述】:
根据 PEP 8,我们应该在函数声明中保持一致,并确保它们都具有相同的返回模式,即所有都应该返回一个表达式,或者都不应该返回。但是,我不确定如何将其应用于生成器。
只要代码到达它们,生成器就会yield 值,除非遇到return 语句,在这种情况下它将停止迭代。但是,我看不到任何从生成器函数返回值的用例。本着这种精神,从 PEP 8 的角度来看,我不明白为什么用明确的 return None 结束这样的功能是有用的。换句话说,如果只有在 yield'ing 结束时才达到 return 表达式,为什么我们应该为生成器表达一个 return 语句?
示例:在以下代码中,我看不到如何使用hello() 将100 分配给变量(因此使用return 语句)。那么为什么 PEP 8 期望我们写一个 return 语句(无论是 100 还是 None)。
def hello():
for i in range(5):
yield i
return 100
h = [x for x in hello()]
g = hello()
print(h)
# [0, 1, 2, 3, 4]
print(g)
# <generator object hello at 0x7fd2f285a7d8>
# can we ever get 100?
【问题讨论】:
-
您误读了 PEP 8。一致性是在单个函数中,而不是在所有函数中。
-
如果你偶尔会从同一个函数返回一个值或 None,请将其写为
return None,而不仅仅是一个普通的return。对于生成器,应用相同的教训:yield None与yield,如果在其他地方你确实产生了一些价值。
标签: python generator yield pep