奇怪的TypeError:'NoneType'对象不可迭代

时间:2016-03-04 09:27:26

标签: python generator

我遇到了一个奇怪的错误。作为这些代码,foo()bar()都会返回None,但只有在迭代bar()时才会引发TypeError

def foo():
  if True:
    return

  yield 1, 2

def bar():
  return

for a, b in foo():
  print a + b

for a, b in bar():
  print a + b

5 个答案:

答案 0 :(得分:3)

因为foo包含yield语句,所以它是一个生成器,因此返回的结果始终是生成器对象,即使无法达到实际的yield语句也是如此。生成器在布尔意义上是真的,因此是你的结果。

答案 1 :(得分:0)

如果你

print foo()
print bar()

你得到了

<generator object foo at 0x7f8a79fd5eb0>
None

答案 2 :(得分:0)

在您的函数foobar中,它们都会显示空的return语句。他们含蓄地return Nonefoo将生成一个迭代器,因为它包含yield语句。

因此,当您循环遍历函数的输出时,foo将使用迭代器值,而bar则不会,导致TypeError

答案 3 :(得分:0)

收益率1,2产生差异。 foo返回:

<generator object foo at 0x7f9e01a91d70>

栏返回:

None

如果你评论屈服部分,代码也会在foo()上崩溃。

您应该为每个方法返回两个值来解决它。

答案 4 :(得分:0)

如果你的函数不包含 yield 语句,并且你希望它返回“空迭代器”,你应该写

def empty()
    raise StopIteration

for each in empty():
    print('this will never show up')