慕容逍客 发表于 2020-6-18 21:08:12

迭代器求解闰年

各位哥哥姐姐,帮帮忙看看我这段程序哪儿有问题?
class LeapYear:
    def __init__(self):
      self.year=1
    def __iter__(self):
      return self
    def __next__(self):
      if self.year<=2020:
            if ((self.year%4==0 and self.year%100!=0) or (self.year%400==0)):
                return self.year
            self.year+=1
      else:
            raise StopIteration

Twilight6 发表于 2020-6-18 21:14:58


这样吧:
class LeapYear:
    def __init__(self):
      self.year=1
    def __iter__(self):
      return self
    def __next__(self):
      if self.year<=2020:
            while True:
                if ((self.year%4==0 and self.year%100!=0) or (self.year%400==0)):
                  self.year += 1
                  return self.year-1
                self.year+=1
      else:
            raise StopIteration

a = LeapYear()
print(next(a))
print(next(a))
print(next(a))
print(next(a))

xiaofeiyu 发表于 2020-6-18 21:21:34

需要在return之前加上self.year+=1,然后return self.year-=1
代码:
class LeapYear:
    def __init__(self):
      self.year=1
    def __iter__(self):
      return self
    def __next__(self):
      if self.year<=2020:
            if ((self.year%4==0 and self.year%100!=0) or (self.year%400==0)):
                self.year+=1
                return self.year-1
            self.year+=1
      else:
            raise StopIteration

for i in LeapYear():
    if i!=None:
      print(i)

xiaofeiyu 发表于 2020-6-18 21:24:56

xiaofeiyu 发表于 2020-6-18 21:21
需要在return之前加上self.year+=1,然后return self.year-=1
代码:

这个是输出所有闰年
两个self.year+=1是因为不管是平年还是闰年都要把年份加“1”,所以if里外都加了

慕容逍客 发表于 2020-6-18 21:26:45

Twilight6 发表于 2020-6-18 21:14
这样吧:

大佬,可不可以解释一下,我代码这样写会出现什么问题?我实在想不明白,可能是没理解__next__.

慕容逍客 发表于 2020-6-18 21:29:28

xiaofeiyu 发表于 2020-6-18 21:24
这个是输出所有闰年
两个self.year+=1是因为不管是平年还是闰年都要把年份加“1”,所以if里外都加了

您好,程序会输出None的原因是什么呀?

Twilight6 发表于 2020-6-18 21:30:28

慕容逍客 发表于 2020-6-18 21:26
大佬,可不可以解释一下,我代码这样写会出现什么问题?我实在想不明白,可能是没理解__next__.


你的代码没有循环 所以不会进入 if 代码块 而且你 if 代码块之外没有设置 __next__ 魔法方法的返回值,所以当不满足 if 条件时候 返回的都是 None

你的代码只有打印到闰年才会返回也就是print(next(a)) 四次才会返回第一个闰年 4 ,而且要在 if 满足后 +1否则下次调用会一直在 4 那

xiaofeiyu 发表于 2020-6-18 21:31:08

慕容逍客 发表于 2020-6-18 21:29
您好,程序会输出None的原因是什么呀?

不对呀,我已经判断了:if i!=None:
      print(i),只有i不是None的时候才输出i呀,而且我测试也没有问题。。。
您再看看代码吧

慕容逍客 发表于 2020-6-18 21:32:41

xiaofeiyu 发表于 2020-6-18 21:24
这个是输出所有闰年
两个self.year+=1是因为不管是平年还是闰年都要把年份加“1”,所以if里外都加了

平年加1不应该放到else里面吗?如果您这样写,不管平年闰年都要加1,而且闰年重复加了一次。

Twilight6 发表于 2020-6-18 21:33:54

慕容逍客 发表于 2020-6-18 21:32
平年加1不应该放到else里面吗?如果您这样写,不管平年闰年都要加1,而且闰年重复加了一次。


你的代码可以这样改,如果不想用循环,而且不想打印 None 的话 就在 if 外也设置个 return 即可

class LeapYear:
    def __init__(self):
      self.year=1
    def __iter__(self):
      return self
    def __next__(self):
      if self.year<=2020:
            if ((self.year%4==0 and self.year%100!=0) or (self.year%400==0)):
                self.year += 1
                return '%d'%(self.year-1)+'是闰年'
            self.year+=1
            return '%d'%(self.year-1)+'不是闰年'
      else:
            raise StopIteration


a = LeapYear()
print(next(a))
print(next(a))
print(next(a))
print(next(a))
print(next(a))
print(next(a))
print(next(a))

xiaofeiyu 发表于 2020-6-18 21:34:23

慕容逍客 发表于 2020-6-18 21:32
平年加1不应该放到else里面吗?如果您这样写,不管平年闰年都要加1,而且闰年重复加了一次。

else是当year大于2020的时候。。。
闰年没有重复加1,return是退出函数,到了这里程序就不会再执行下面的内容了

Twilight6 发表于 2020-6-18 21:35:58

慕容逍客 发表于 2020-6-18 21:26
大佬,可不可以解释一下,我代码这样写会出现什么问题?我实在想不明白,可能是没理解__next__.

并不是因为你没有理解__next__ 所有函数都是这样的 ,如果函数没有执行到 return 的值 那么 Python 默认返回的就是 None滴~~

比如:
def func():
    pass
print(func())
这样也是打印了 None就是因为没有设置 return~~~

慕容逍客 发表于 2020-6-18 21:41:15

xiaofeiyu 发表于 2020-6-18 21:34
else是当year大于2020的时候。。。
闰年没有重复加1,return是退出函数,到了这里程序就不会再执行下面 ...

emmmmmmmmm,我忘了return之后就会退出函数了,谢谢<抱拳>

xiaofeiyu 发表于 2020-6-18 21:42:01

慕容逍客 发表于 2020-6-18 21:41
emmmmmmmmm,我忘了return之后就会退出函数了,谢谢

不客气~

慕容逍客 发表于 2020-6-18 21:42:59

慕容逍客 发表于 2020-6-18 21:41
emmmmmmmmm,我忘了return之后就会退出函数了,谢谢

两个都想设最佳怎么办{:10_297:},谢谢两位大佬<抱拳>

Twilight6 发表于 2020-6-18 21:44:45

慕容逍客 发表于 2020-6-18 21:42
两个都想设最佳怎么办,谢谢两位大佬

哈哈没事 随意就好~

慕容逍客 发表于 2020-6-18 21:45:02

Twilight6 发表于 2020-6-18 21:35
并不是因为你没有理解__next__ 所有函数都是这样的 ,如果函数没有执行到 return 的值 那么 Python 默 ...

唉,搞了半天是我没有真正理解函数中的return{:10_243:}

Twilight6 发表于 2020-6-18 21:46:19

慕容逍客 发表于 2020-6-18 21:45
唉,搞了半天是我没有真正理解函数中的return

多用就会娴熟起来了~开始的阶段都会的~加油吧!
https://xxx.ilovefishc.com/forum/202005/27/132745rjvcvw1z2148jthd.gif

xiaofeiyu 发表于 2020-6-18 21:46:51

慕容逍客 发表于 2020-6-18 21:42
两个都想设最佳怎么办,谢谢两位大佬

哈哈没关系的
页: [1]
查看完整版本: 迭代器求解闰年