您可以
return在生成器中使用一次;它会停止迭代而不会产生任何结果,因此提供了一种使函数超出范围的明确选择。因此,用于
yield将函数转换为生成器,但在
return产生任何内容之前先终止该生成器。
>>> def f():... return... yield... >>> list(f())[]
我不确定这是否比您拥有的要好得多-它只是将无操作
if语句替换为无操作
yield语句。但这更惯用了。请注意,仅使用
yield不起作用。
>>> def f():... yield... >>> list(f())[None]
为什么不只是使用iter(())
?
这个问题专门询问一个空的 生成器函数 。因此,我将其视为关于Python语法的内部一致性的问题,而不是一般而言有关创建空迭代器的最佳方法的问题。
如果问题实际上是关于创建一个空迭代器的最佳方法,那么您可能同意Zectbumo关于使用它的
iter(())替代方法。但是,请务必注意
iter(())不要返回函数!它直接返回一个空的Iterable。假设您正在使用一个期望可调用的API,该API在每次调用时都会
返回 一个可迭代对象,就像普通的生成器函数一样。您将必须执行以下操作:
def empty(): return iter(())
现在,您可能会发现上面的内容更加清晰,但是我可以想象一下情况不太清楚的情况。考虑以下(伪造的)生成器函数定义列表的示例:
def zeros(): while True: yield 0def ones(): while True: yield 1...
在那长列表的末尾,我宁愿看到其中包含
yield的内容,如下所示:
def empty(): return yield
或者,在Python
3.3及更高版本中(如DSM所建议的那样):
def empty(): yield from ()
对存在
yield关键字清楚地在最短的一瞥,这只是另一个发生器功能,所有其他的一模一样。要花更多的时间才能看到
iter(())版本正在执行相同的操作。
这是一个细微的差异,但是老实说,我认为
yield基于功能的函数更具可读性和可维护性。
另请参阅user3840170的一个很好的答案,该答案
dis用来显示此方法可取的另一个原因:编译时它发出最少的指令。



