鱼C论坛

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

[已解决]第48课:迭代器,闰年判定

[复制链接]
发表于 2021-3-30 14:29:59 | 显示全部楼层 |阅读模式

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

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

x
原题:写一个迭代器,要求输出至今为止的所有闰年。
标准答案:
  1. import datetime as dt

  2. class LeapYear:
  3.     def __init__(self):
  4.         self.now = dt.date.today().year

  5.     def isLeapYear(self, year):
  6.         if (year%4 == 0 and year%100 != 0) or (year%400 == 0):
  7.             return True
  8.         else:
  9.             return False

  10.     def __iter__(self):
  11.         return self

  12.     def __next__(self):
  13.         while not self.isLeapYear(self.now):
  14.             self.now -= 1

  15.         temp = self.now
  16.         self.now -= 1

  17.         return temp
复制代码

问题:
1. 第5句里,today后面为何有个()?
2. 第16-18句,为何要定义 __next__?这个魔法方法,不是 Python 自带的么?
3. 第20句,self.now 直接赋值给 temp, 是怎么知道self.now 符合条件的?
4. 第21句,为何要重复一遍 self.now -= 1?
谢谢~ 看到好答案,保证迅速给“最佳”
最佳答案
2021-3-30 17:43:03
1、today是一个方法(函数),调用的时候要加括号
2、这是自定义类对__next__的重写,有自己设置的“规则”,比如这里的闰年判断
3、
  1.         while not self.isLeapYear(self.now):
  2.             self.now -= 1

  3.         temp = self.now
  4.         self.now -= 1
复制代码

while表示不是闰年的那一个分支,只有当while不成立时,才会执行        temp = self.now,所以是符合条件的

4、还是上面那四行,不管是否为闰年,没执行一次next,都必须now-1,最后加的这一行-1,就是为了满足所有未进入while的分支中也要now-1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-3-30 17:43:03 | 显示全部楼层    本楼为最佳答案   
1、today是一个方法(函数),调用的时候要加括号
2、这是自定义类对__next__的重写,有自己设置的“规则”,比如这里的闰年判断
3、
  1.         while not self.isLeapYear(self.now):
  2.             self.now -= 1

  3.         temp = self.now
  4.         self.now -= 1
复制代码

while表示不是闰年的那一个分支,只有当while不成立时,才会执行        temp = self.now,所以是符合条件的

4、还是上面那四行,不管是否为闰年,没执行一次next,都必须now-1,最后加的这一行-1,就是为了满足所有未进入while的分支中也要now-1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-30 18:01:45 | 显示全部楼层
昨非 发表于 2021-3-30 17:43
1、today是一个方法(函数),调用的时候要加括号
2、这是自定义类对__next__的重写,有自己设置的“规则 ...

谢谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-30 19:01:32 | 显示全部楼层
本帖最后由 jackz007 于 2021-3-30 19:18 编辑

       我估计关键的问题是,你不知道应该如何使用这个类,给你一个实例,有了实例就好理解多了。
       此外,这个类定义有缺陷,__next__() 会无限循环,没有终点。
  1. import datetime as dt

  2. class LeapYear:
  3.     def __init__(self , end = 0):        # 添加新的类属性 end,用于确定迭代终点,如果缺省,那就一直迭代到公元 0 年
  4.         self.now = dt.date.today().year
  5.         self.end = end                   # 为新属性赋值

  6.     def isLeapYear(self, year):
  7.         if (year%4 == 0 and year%100 != 0) or (year%400 == 0):
  8.             return True
  9.         else:
  10.             return False

  11.     def __iter__(self):
  12.         return self

  13.     def __next__(self):

  14.         while not self.isLeapYear(self.now) and self.now > 0:
  15.             self.now -= 1
  16.         if self.now >= self.end:         # 如果没有到达迭代终点
  17.             temp = self.now
  18.             self.now -= 1
  19.             return temp
  20.         else:                            # 否则
  21.             raise StopIteration()        # 终结迭代器
  22. for x in LeapYear(1900):
  23.     print(x)
复制代码

        运行实况
  1. D:\0002.Exercise\Python>python x.py
  2. 2020
  3. 2016
  4. 2012
  5. 2008
  6. 2004
  7. 2000
  8. 1996
  9. 1992
  10. 1988
  11. 1984
  12. 1980
  13. 1976
  14. 1972
  15. 1968
  16. 1964
  17. 1960
  18. 1956
  19. 1952
  20. 1948
  21. 1944
  22. 1940
  23. 1936
  24. 1932
  25. 1928
  26. 1924
  27. 1920
  28. 1916
  29. 1912
  30. 1908
  31. 1904

  32. D:\0002.Exercise\Python>
复制代码

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2021-3-31 08:25:37 | 显示全部楼层
jackz007 发表于 2021-3-30 19:01
我估计关键的问题是,你不知道应该如何使用这个类,给你一个实例,有了实例就好理解多了。
        ...

太好了,谢谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-20 04:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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