为什么我会收到此错误?TypeError: iter() 返回了类型为 'NoneType' 的非迭代器



我正在尝试学习__iter__方法,这是我得到的错误:

print(i for i in my_iter)
TypeError: iter() returned non-iterator of type 'NoneType'
我的代码如下:
class IterMethod:
def __init__(self, last_elem):
pass
def __iter__(self):
i = 5
while i <= 50:
print(f"this is {i}")
i = i + 10

my_iter = IterMethod(60)
print(i for i in my_iter)

你能解释一下吗?谢谢!

我很抱歉,因为我急于提供答案,我没有解释为什么会出现错误。这次编辑将包括解释)

解释:

TypeError: iter() returned non-iterator of type 'NoneType'表示__iter__()没有返回任何值(默认情况下,这意味着对于"No return value"它是None(在这种特殊情况下)。(令人困惑,我知道这意味着它在技术上返回None。)

__iter__每次从函数内部"生成"一个值时必须返回一个值。如果没有返回值,就会得到错误。

请注意,当我说return a value时,你不使用return。对于, iter(这基本上是一个生成器函数),您需要使用yield。如果你对此感到困惑,请仔细阅读什么是生成器。例如,在https://www.geeksforgeeks.org/generators-in-python/(例如,不隶属于此链接)。

所以…

两个问题加一个变化(由@DanielWalker建议):

  1. 您可以通过更改
  2. 来使其更简单:
i = i + 10

i += 10
  1. 您需要更改您的print(i for i in my_iter)

因此打印生成器签名。你想要的是:

print(list(i for i in my_iter))
  1. 你需要在你的__iter__方法中有一个yield语句。

根据您是否希望i值为,您有以下选项:

class IterMethod:
def __init__(self, last_elem):
pass
def __iter__(self):
i = 5
while i <= 50:
print(f"this is {i}")
i += 10
yield i

my_iter = IterMethod(60)
print(list(i for i in my_iter))

那么这将输出:

this is 5
this is 15
this is 25
this is 35
this is 45
[15, 25, 35, 45, 55]

现在如果你想在i = i + 10之前显示i的值,

class IterMethod:
def __init__(self, last_elem):
pass
def __iter__(self):
i = 5
while i <= 50:
print(f"this is {i}")
yield i
i += 10

my_iter = IterMethod(60)
print(list(i for i in my_iter))

这将输出:

this is 5
this is 15
this is 25
this is 35
this is 45
[5, 15, 25, 35, 45]

简而言之,您可能忘记了return关键字或您返回的方法实际上是None__iter__应该返回一个可迭代对象。

def __iter__(self):
return iter(self._internal_dict)

使用不同的方法返回生成器:

def generator(self):
for item in self._internal_dict.items()
yield item

相关内容

  • 没有找到相关文章

最新更新