在Python中产生突破

根据对这个问题的回答,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

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

谢谢,


处理这个问题的一个好方法是提高StopIteration,当你的迭代器没有剩下任何东西放弃并调用next()时,会引发StopIteration。 这也将优雅地摆脱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号以下列表。


def generate_nothing():
    return
    yield

def generate_nothing():
    return iter([])
链接地址: http://www.djcxy.com/p/54333.html

上一篇: yield break in Python

下一篇: Does Scala have an equivalent to C# yield?