迭代器
class Run():def __init__(self):
self.a=2020
def __iter__(self):
return self
def __next__(self):
if 0<=self.a:
if (self.a%4==0 and self.a%100!=0) or (self.a%400==0):
return self.a
self.a-=1
else:
raise StopIteration('太小了!')
r=Run()
for i in r:
if i>=2000:
print(i)
else:
break
求指教这段代码的错误在哪 为什么一直输出2020不停? 本帖最后由 Twilight6 于 2020-6-19 11:37 编辑
因为你这的代码:
if 0<=self.a:
if (self.a%4==0 and self.a%100!=0) or (self.a%400==0):
return self.a
self.a-=1
迭代器条件成立后 return 执行就不会执行下面的代码,也就是红色代码不会运行了,导致你每次迭代都是执行上一次条件成立的值了~
这样即可
class Run():
def __init__(self):
self.a=2020
def __iter__(self):
return self
def __next__(self):
if 0<=self.a:
if (self.a%4==0 and self.a%100!=0) or (self.a%400==0):
self.a -= 1
return self.a+1
self.a-=1
else:
raise StopIteration('太小了!')
r=Run()
for i in r:
if i!=None and i>=2000:
print(i)
Twilight6 发表于 2020-6-19 11:36
因为你这的代码:
迭代器条件成立后 return 执行就不会执行下面的代码,也就是红色代码不会运行了,导 ...
懂了懂了 谢谢 今天的我更强了 发表于 2020-6-19 11:37
懂了懂了 谢谢
{:10_282:} Twilight6 发表于 2020-6-19 11:38
class Run():
def __init__(self):
self.a=2021
def __iter__(self):
return self
def __next__(self):
if 0<=self.a:
self.a-=1
if (self.a%4==0 and self.a%100!=0) or (self.a%400==0):
return self.a
else:
raise StopIteration('太小了!')
r=Run()
for i in r:
if i>=2000:
print(i)
else:
break
修改了之后还是报错TypeError: '>=' not supported between instances of 'NoneType' and 'int'
感觉逻辑上没问题啊{:10_266:} 今天的我更强了 发表于 2020-6-19 11:44
class Run():
def __init__(self):
self.a=2021
看报错:
TypeError: '>=' not supported between instances of 'NoneType' and 'int'
说NoneType 无法和整型判断大小 说明你函数返回了 None 你参考下我上面的代码,就可以正常运行了 Twilight6 发表于 2020-6-19 11:47
看报错:
你的代码我看懂了 也理解了,可是这一段代码的问题在哪?能再帮忙点一下吗? 今天的我更强了 发表于 2020-6-19 11:57
你的代码我看懂了 也理解了,可是这一段代码的问题在哪?能再帮忙点一下吗?
好 看代码这里:
def __next__(self):
if 0<=self.a:
self.a-=1
if (self.a%4==0 and self.a%100!=0) or (self.a%400==0):
return self.a
else:
raise StopIteration('太小了!')
迭代过程中只有 if 条件成立 才会执行里面的 return ,当你 if 条件不满足时候 if 外部没有设置 return 返回值
所以 Python 会默认返回一个 None而 None 无法比较大小,导致报错,所以我那 for 循环里的 if 条件先判断是否为 None 才进行下一步
Twilight6 发表于 2020-6-19 11:59
好 看代码这里:
最后一个问题.....我的也设置成你那样之后
class Run():
def __init__(self):
self.a=2021
def __iter__(self):
return self
def __next__(self):
if 0<=self.a:
self.a-=1
if (self.a%4==0 and self.a%100!=0) or (self.a%400==0):
return self.a
else:
raise StopIteration('太小了!')
r=Run()
for i in r:
if i!=None and i>=2000:
print(i)
else:
break
为什么只返回来一个2020..
拜托了 今天的我更强了 发表于 2020-6-19 12:09
最后一个问题.....我的也设置成你那样之后
class Run():
def __init__(self):
因为第二次for 循环不满足条件 就执行 else 了然后就 break 退出循环了~
去掉 else 和 break 即可 Twilight6 发表于 2020-6-19 12:10
因为第二次for 循环不满足条件 就执行 else 了然后就 break 退出循环了~
去掉 else 和 break 即可
卧槽. 牛 谢谢谢谢
页:
[1]