鱼C论坛

 找回密码
 立即注册
查看: 1074|回复: 4

[已解决]在迭代器的课后作业卡住了,没弄明白,还请大佬帮忙解答一下

[复制链接]
发表于 2022-3-26 21:59:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
迭代器的课后作业动动手,题目:写一个迭代器,要求输出迄今为止所有的闰年;

我的代码是这样:
  1. class Leapyear:
  2.     def __init__(self):
  3.         self.year=0
  4.     def __iter__(self):
  5.         return self
  6.     def __next__(self):
  7.         self.year=self.year+1
  8.         if self.year%4==0 and self.year%100 !=0:
  9.             return self,year
复制代码

  1. for each in leapyear:
  2.     if each<10000:
  3.         print(each)

复制代码


我理解的是在next里面让年份每次自动+1,然后碰到满足的条件时,就返回符合条件的年份。但是输出的结果报错“TypeError: '<' not supported between instances of 'NoneType' and 'int'”
错误的地方应该是在返回的self.year里面有很多None的值,没办法和int类型进行比较。这里的代码只是想初步测试一下核心功能能否实现,但是在测试的时候就发现了问题。

但是不明白为什么会在类里返回大量的none值...

还请大神帮忙看一下原理,万分感谢。
最佳答案
2022-3-26 22:35:25
因为你的迭代器的 __next__ 方法里面如果 if 条件不满足的话,就不会执行 if 语句块里面的 return self.year,

所以就返回了默认的 None,而你后面在 for 循环里面用 each 与 10000 比较,当 each 为 None 时,是没法比较的,

所以你应该要先判断一下 each 存不存在,用 and 就可以,

因为 and 的短路机制只有第一个表达式为 True 才会判断第二个表达式,None 很显然为 False,

故对你的代码修改如下:
  1. class Leapyear:
  2.     def __init__(self):
  3.         self.year=0
  4.     def __iter__(self):
  5.         return self
  6.     def __next__(self):
  7.         self.year=self.year+1
  8.         if self.year%4==0 and self.year%100 !=0:
  9.             return self.year

  10. leapyear = Leapyear()

  11. for each in leapyear:
  12.     if each and each<10000:                   # 改了这行
  13.         print(each)
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-3-26 22:10:26 | 显示全部楼层
你想要这样?
  1. class Leapyear:
  2.     def __init__(self):
  3.         self.year=0
  4.     def __iter__(self):
  5.         return self
  6.     def __next__(self):
  7.         self.year=self.year+1
  8.         if self.year%4==0 and self.year%100 !=0:
  9.             return self.year
  10.         else:
  11.             return self.__next__()

  12. leapyear = Leapyear()

  13. for each in leapyear:
  14.     if each < 1e5:
  15.         print(each)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-26 22:35:25 | 显示全部楼层    本楼为最佳答案   
因为你的迭代器的 __next__ 方法里面如果 if 条件不满足的话,就不会执行 if 语句块里面的 return self.year,

所以就返回了默认的 None,而你后面在 for 循环里面用 each 与 10000 比较,当 each 为 None 时,是没法比较的,

所以你应该要先判断一下 each 存不存在,用 and 就可以,

因为 and 的短路机制只有第一个表达式为 True 才会判断第二个表达式,None 很显然为 False,

故对你的代码修改如下:
  1. class Leapyear:
  2.     def __init__(self):
  3.         self.year=0
  4.     def __iter__(self):
  5.         return self
  6.     def __next__(self):
  7.         self.year=self.year+1
  8.         if self.year%4==0 and self.year%100 !=0:
  9.             return self.year

  10. leapyear = Leapyear()

  11. for each in leapyear:
  12.     if each and each<10000:                   # 改了这行
  13.         print(each)
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-31 11:17:18 | 显示全部楼层
isdkz 发表于 2022-3-26 22:35
因为你的迭代器的 __next__ 方法里面如果 if 条件不满足的话,就不会执行 if 语句块里面的 return self.yea ...

万分感谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-31 11:18:10 | 显示全部楼层

万分感谢~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-29 09:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表