haloparty 发表于 2022-3-26 21:59:24

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

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

我的代码是这样:
class Leapyear:
    def __init__(self):
      self.year=0
    def __iter__(self):
      return self
    def __next__(self):
      self.year=self.year+1
      if self.year%4==0 and self.year%100 !=0:
            return self,year

for each in leapyear:
    if each<10000:
      print(each)



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

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

还请大神帮忙看一下原理,万分感谢。

傻眼貓咪 发表于 2022-3-26 22:10:26

你想要这样?class Leapyear:
    def __init__(self):
      self.year=0
    def __iter__(self):
      return self
    def __next__(self):
      self.year=self.year+1
      if self.year%4==0 and self.year%100 !=0:
            return self.year
      else:
            return self.__next__()

leapyear = Leapyear()

for each in leapyear:
    if each < 1e5:
      print(each)

isdkz 发表于 2022-3-26 22:35:25

因为你的迭代器的 __next__ 方法里面如果 if 条件不满足的话,就不会执行 if 语句块里面的 return self.year,

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

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

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

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

leapyear = Leapyear()

for each in leapyear:
    if each and each<10000:                   # 改了这行
      print(each)

haloparty 发表于 2022-3-31 11:17:18

isdkz 发表于 2022-3-26 22:35
因为你的迭代器的 __next__ 方法里面如果 if 条件不满足的话,就不会执行 if 语句块里面的 return self.yea ...

万分感谢

haloparty 发表于 2022-3-31 11:18:10

傻眼貓咪 发表于 2022-3-26 22:10
你想要这样?

万分感谢~
页: [1]
查看完整版本: 在迭代器的课后作业卡住了,没弄明白,还请大佬帮忙解答一下