只爱整活周淑怡 发表于 2020-8-27 20:52:11

48讲动动手 1

要求计算从现在开始到2000年的闰年年份

我打的这段class LeapYear:
    def __init__(self):
      self.year=2020
      self.origin=2000

    def __iter__(self):
      return self

    def __next__(self):
      if self.year>=self.origin:
            if (self.year%4 == 0 and self.year%100 != 0) or (self.year%400 == 0):
                print(self.year)
                self.year-=1
               
            else:
                self.year-=1
               

      else:
            raise StopIteration
            


通过L=LeapYear()
        for i in L:
        print(i)

打出来的是
2020
None
None
None
None
2016
None
None
None
None
2012
None
None
None
None
2008
None
None
None
None
2004
None
None
None
None
2000
None

能请教下是哪里出问题了吗?

sunrise085 发表于 2020-8-27 21:14:54

那些None是因为你写的__next__没有返回值,那些年份是在__next__中输出的。
正常情况下应该是在__next__中有个循环,当是闰年的时候,进行return
class LeapYear:
    def __init__(self):
      self.year=2020
      self.origin=2000

    def __iter__(self):
      return self

    def __next__(self):
      if self.year>=self.origin:
            while not (self.year%4 == 0 and self.year%100 != 0) or (self.year%400 == 0):#这里改为while循环,当不是闰年的时候,就继续循环
                #print(self.year)
                self.year-=1
            temp=self.year#是闰年的时候,保存该年份
            self.year-=1#继续减一
            return temp#然后返回闰年年份

      else:
            raise StopIteration

昨非 发表于 2020-8-27 21:15:03

本帖最后由 昨非 于 2020-8-27 21:19 编辑

if (self.year%4 == 0 and self.year%100 != 0) or (self.year%400 == 0):
                print(self.year)
                self.year-=1
               
            else:
                self.year-=1

看这段代码,只有判断为真(是闰年)时,才会答应出对应年份,此时,以迭代器访问到的 i 为你想要的闰年年份
否则(判断条件不成立时),迭代器没有任何返回值,所以循环访问i的结果就是none

所以应该:
L=LeapYear()
for i in L:
    if i>=0:
      print(i)
    else:
      break
将返回为空的i跳过,就好

只爱整活周淑怡 发表于 2020-8-28 12:44:31

sunrise085 发表于 2020-8-27 21:14
那些None是因为你写的__next__没有返回值,那些年份是在__next__中输出的。
正常情况下应该是在__next__中 ...

所以说必须用return 是吗??print是不行的?

sunrise085 发表于 2020-8-28 12:53:35

只爱整活周淑怡 发表于 2020-8-28 12:44
所以说必须用return 是吗??print是不行的?

当然啦!
页: [1]
查看完整版本: 48讲动动手 1