Python中的yield break

时间:2011-06-18 09:21:21

标签: python generator yield

根据对这个question的回答,C#中的yield break相当于在python中返回。在正常情况下,'return'确实会停止发电机。但是如果你的函数除了返回之外什么都不做,你将得到一个None而不是一个空的迭代器,它由C#中的yield break返回

def generate_nothing():
    return

for i in generate_nothing():
    print i

你会得到一个TypeError:'NoneType'对象不可迭代。 但是如果我在返回之前添加一个从不运行的yield,这个函数会返回我期望的结果。

def generate_nothing():
    if False: yield None
    return

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

感谢,

4 个答案:

答案 0 :(得分:44)

def generate_nothing():
    return
    yield

答案 1 :(得分:41)

处理此问题的一个好方法是提高StopIteration,这是当迭代器没有任何东西可以产生并且next()被调用时引发的。这也将优雅地打破for循环,在循环中没有任何内容被执行。

例如,给定元组(0, 1, 2, 3)我希望得到重叠对((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个或更少的列表。

答案 2 :(得分:6)

def generate_nothing():
    return iter([])

答案 3 :(得分:1)

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

>>> 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