Python中的yield break

| 根据对这个问题的回答,C#中的“ 0”等效于Python中的“ 1”。在正常情况下,ѭ1确实会停止发电机。但是,如果您的函数只执行
return
,则将得到
None
,而不是空的迭代器,它在C#中由
yield break
返回。
def generate_nothing():
    return

for i in generate_nothing():
    print i
你会得到
TypeError: \'NoneType\' object is not iterable
, 但是,如果我添加并且从未在ѭ1and之前运行
yield
,此函数将返回我期望的结果。
def generate_nothing():
    if False: yield None
    return
它有效,但看起来很奇怪。你有更好的主意吗?     
已邀请:
        解决此问题的一种好方法是提高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个以下的列表。     
        
def generate_nothing():
    return
    yield
    
        
def generate_nothing():
    return iter([])
    
        有趣的是,这两个函数具有相同的字节码。字节码编译器找到
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
    

要回复问题请先登录注册