鱼C论坛

 找回密码
 立即注册
查看: 746|回复: 2

[已解决]迭代器

[复制链接]
发表于 2019-5-3 20:06:07 | 显示全部楼层 |阅读模式

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

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

x
class leapyear:

    def __init__(self):
        self.year = 2019
        
    def __iter__(self):
        return self

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

>>> c= leapyear()
>>> for i in c:
        if i >= 2000:
                print(i)
        else:
                break

想问一下为什么这个代码输出的全是2016
最佳答案
2019-5-3 22:23:50
本帖最后由 jackz007 于 2019-5-3 22:33 编辑

      由于__next__() 每次开始时的 self . year 就是闰年,但却不是我们所需要的,所以,应该把 self . year 的减 1 操作安排在循环的入口处,这样,就会避免 self . year 无法步进的问题了。此外,楼主判断闰年的条件也是错误的,判断闰年不变的前提必须是 4 的倍数,在这个范围内,剔除100的倍数,保留400的倍数。

      楼主试试我修改的代码,看看是不是你想要的效果。
  1. class LeapYear:
  2.     def __init__(self , year = 2019):
  3.         self . year = year
  4.         
  5.     def __iter__(self):
  6.         return self

  7.     def __next__(self):
  8.         while True:
  9.             self . year -= 1
  10.             if self . year < 2000:
  11.                 raise StopIteration
  12.             else:
  13.                 if (self . year % 4 == 0) and (self . year % 100 != 0 or self . year % 400 == 0):
  14.                      break
  15.         return self . year

  16. c = LeapYear()
  17. for i in c:
  18.     print(i)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-5-3 22:23:50 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2019-5-3 22:33 编辑

      由于__next__() 每次开始时的 self . year 就是闰年,但却不是我们所需要的,所以,应该把 self . year 的减 1 操作安排在循环的入口处,这样,就会避免 self . year 无法步进的问题了。此外,楼主判断闰年的条件也是错误的,判断闰年不变的前提必须是 4 的倍数,在这个范围内,剔除100的倍数,保留400的倍数。

      楼主试试我修改的代码,看看是不是你想要的效果。
  1. class LeapYear:
  2.     def __init__(self , year = 2019):
  3.         self . year = year
  4.         
  5.     def __iter__(self):
  6.         return self

  7.     def __next__(self):
  8.         while True:
  9.             self . year -= 1
  10.             if self . year < 2000:
  11.                 raise StopIteration
  12.             else:
  13.                 if (self . year % 4 == 0) and (self . year % 100 != 0 or self . year % 400 == 0):
  14.                      break
  15.         return self . year

  16. c = LeapYear()
  17. for i in c:
  18.     print(i)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-3 20:28:01 | 显示全部楼层
你应该将return放在self.year = self.year - 1的后面,程序是不会执行return之后的语句
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-19 04:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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