鱼C论坛

 找回密码
 立即注册
查看: 883|回复: 18

[已解决]迭代器求解闰年

[复制链接]
发表于 2020-6-18 21:08:12 | 显示全部楼层 |阅读模式

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

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

x
各位哥哥姐姐,帮帮忙看看我这段程序哪儿有问题?
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
最佳答案
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))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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里外都加了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-18 21:26:45 | 显示全部楼层

大佬,可不可以解释一下,我代码这样写会出现什么问题?我实在想不明白,可能是没理解__next__.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

您好,程序会输出None的原因是什么呀?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


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

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

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

使用道具 举报

发表于 2020-6-18 21:31:08 | 显示全部楼层
慕容逍客 发表于 2020-6-18 21:29
您好,程序会输出None的原因是什么呀?

不对呀,我已经判断了:
if i!=None:
        print(i)
,只有i不是None的时候才输出i呀,而且我测试也没有问题。。。
您再看看代码吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

平年加1不应该放到else里面吗?如果您这样写,不管平年闰年都要加1,而且闰年重复加了一次。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

else是当year大于2020的时候。。。
闰年没有重复加1,return是退出函数,到了这里程序就不会再执行下面的内容了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


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

比如:
def func():
    pass
print(func())
这样也是打印了 None  就是因为没有设置 return~~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

emmmmmmmmm,我忘了return之后就会退出函数了,谢谢<抱拳>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-18 21:42:01 | 显示全部楼层
慕容逍客 发表于 2020-6-18 21:41
emmmmmmmmm,我忘了return之后就会退出函数了,谢谢

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

使用道具 举报

 楼主| 发表于 2020-6-18 21:42:59 | 显示全部楼层
慕容逍客 发表于 2020-6-18 21:41
emmmmmmmmm,我忘了return之后就会退出函数了,谢谢

两个都想设最佳怎么办,谢谢两位大佬<抱拳>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-18 21:44:45 | 显示全部楼层
慕容逍客 发表于 2020-6-18 21:42
两个都想设最佳怎么办,谢谢两位大佬

哈哈  没事 随意就好~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

唉,搞了半天是我没有真正理解函数中的return
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-18 21:46:19 | 显示全部楼层
慕容逍客 发表于 2020-6-18 21:45
唉,搞了半天是我没有真正理解函数中的return

多用就会娴熟起来了~开始的阶段都会的~加油吧!

                               
登录/注册后可看大图
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-18 21:46:51 | 显示全部楼层
慕容逍客 发表于 2020-6-18 21:42
两个都想设最佳怎么办,谢谢两位大佬

哈哈没关系的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-20 13:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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