generator-Python中的收益中断

根据对这个问题的回答,C#中的yield break等同于python中的return。 在正常情况下,“返回”确实会停止发电机。 但是,如果您的函数只执行返回操作,则将获得None而不是空的迭代器,该迭代器由C#中的yield break返回

def generate_nothing():
    return

for i in generate_nothing():
    print i

您将收到TypeError:'NoneType'对象不可迭代。但是,如果我在返回前添加了永不运行的收益,则此函数将返回我期望的结果。

def generate_nothing():
    if False: yield None
    return

如果可行,但似乎有线。 谁有更好的主意?

谢谢,

Sonic Lee asked 2020-01-29T09:42:13Z
4个解决方案
46 votes

解决此问题的一种好方法是提高StopIteration,这是在您的迭代器没有剩余可屈服且调用pairs时引发的。 这也将优雅地脱离for循环,而在循环内不执行任何操作。

例如,给定一个元组pairs,我想获得重叠对((0, 1), (1, 2), (2, 3))。我可以这样:

def pairs(numbers):
    if len(numbers) < 2:
        raise StopIteration

    for i, number in enumerate(numbers[1:]):
        yield numbers[i], number

现在pairs安全地处理1个数字或更少的列表。

Sam Simmons answered 2020-01-29T09:42:35Z
45 votes
def generate_nothing():
    return
    yield
ninjagecko answered 2020-01-29T09:42:50Z
6 votes
def generate_nothing():
    return iter([])
phihag answered 2020-01-29T09:43:06Z
2 votes

有趣的是,这两个函数具有相同的字节码。 当字节码编译器找到yield关键字时,可能会有一个设置为generator的标志。

>>> def f():
...   return

>>> def g():
...   if False: yield 
#in Python2 you can use 0 instead of False to achieve the same result


>>> from dis import dis
>>> dis(f)
2           0 LOAD_CONST               0 (None) 
            3 RETURN_VALUE
>>> dis(g)
2           0 LOAD_CONST               0 (None) 
            3 RETURN_VALUE
JBernardo answered 2020-01-29T09:43:27Z
translate from https://stackoverflow.com:/questions/6395063/yield-break-in-python