why am I getting this error? TypeError: iter() returned non-iterator of type 'NoneType'
why am I getting this error? TypeError: iter() returned non-iterator of type '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__()
没有 returning 任何值(默认情况下,这意味着它是 None 表示“没有 return 值”(在这种特殊情况下))。 (令人困惑,我知道这意味着它在技术上 returning None。)
__iter__
必须 return 一个值,每次它 'generates' 一个来自函数内部的值。如果它没有 return 一个值,则会出现错误。
请注意,当我说 return a value
时,您不会使用 return
。在iter(基本上是一个生成器函数)的情况下,你需要使用yield
。如果您对此感到困惑,请阅读什么是生成器。即在 https://www.geeksforgeeks.org/generators-in-python/(例如,不隶属于此 link)。
所以...
两个问题加一个更改(如@DanielWalker 所建议):
- 您可以通过更改使其更简单:
i = i + 10
至
i += 10
- 您需要更改
print(i for i in my_iter)
。
照原样打印生成器签名。你想要的是:
print(list(i for i in my_iter))
- 您的
__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]
我正在尝试学习 __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__()
没有 returning 任何值(默认情况下,这意味着它是 None 表示“没有 return 值”(在这种特殊情况下))。 (令人困惑,我知道这意味着它在技术上 returning None。)
__iter__
必须 return 一个值,每次它 'generates' 一个来自函数内部的值。如果它没有 return 一个值,则会出现错误。
请注意,当我说 return a value
时,您不会使用 return
。在iter(基本上是一个生成器函数)的情况下,你需要使用yield
。如果您对此感到困惑,请阅读什么是生成器。即在 https://www.geeksforgeeks.org/generators-in-python/(例如,不隶属于此 link)。
所以...
两个问题加一个更改(如@DanielWalker 所建议):
- 您可以通过更改使其更简单:
i = i + 10
至
i += 10
- 您需要更改
print(i for i in my_iter)
。
照原样打印生成器签名。你想要的是:
print(list(i for i in my_iter))
- 您的
__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]