鱼C论坛

 找回密码
 立即注册
查看: 3271|回复: 6

求助第48讲,迭代器中的难问题

[复制链接]
发表于 2017-3-18 09:25:07 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 wxq199459 于 2017-3-18 10:56 编辑
class Fibs:
    def __init__(self,n=20):
        self.a=0
        self.b=1
        self.n=n
    def __iter__(self):
       return self
    def __next__(self):
       self.a,self.b = self.b,self.a + self.b
       if self.a > self.n:
           raise StopIteration
       return self.a

求问一下,这里raise了 stopiteraion  为什么运行 fibs = Fibs for each in fibs():print (each) 的时候没有在迭代最后报错呢?

还有一个问题是:
import datetime as dt

class LY:
    def __init__(self):
        self.now = dt.date.today().year

    def __iter__(self):
        return self

    def isLY(self,year):
        if ((year%4==0 and year%100!=0) or (year%400 == 0)):
            return 1
        else:
            return 0

    def __next__(self):
        while not self.isLY(self.now):
            self.now-=1         #当前年份不是闰年时,now自动-1

        temp = self.now    #把now的值赋给temp
        self.now-=1

        return temp

最后这段定义__next__的地方没看懂,不是闰年时调用self.now-1,后面为什么还要-1?如果这样的话岂不是无论是不是闰年都return了吗?
有没有大神来解释一下这个__next__的返回值到底应该怎么设置,感觉小甲鱼老师在视频中并没有很清楚的说明出来

希望大佬能来说明一下,不胜感激!!!等级不够没法发悬赏
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-3-18 13:43:37 | 显示全部楼层
自顶一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-5-4 14:31:58 | 显示全部楼层
return 是temp啊
第二次self.now-1 是作为下一次迭代的初始值把
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-5-31 09:49:12 | 显示全部楼层
Isaiah 发表于 2017-5-4 14:31
return 是temp啊
第二次self.now-1 是作为下一次迭代的初始值把

那岂不是减了两次1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-5-31 10:43:12 | 显示全部楼层
第一个问题:
raise StopIteration 是作为 for 循环结束的标志,当 for 循环接收到这个异常时就会退出循环,并不会打印异常信息 。

第二个问题:
不是闰年的话就减1,然后while循环再判断是不是闰年,如果还不是的话就再减,直到是闰年才会跳出循环。然后self.now的值赋给temp作为返回。然后self.now减1,来寻找下一个闰年
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-4 16:24:50 | 显示全部楼层
楼主明白了吗 第一个问题 为何不会抛出异常?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-4 16:25:53 | 显示全部楼层
天空圣域 发表于 2017-5-31 10:43
第一个问题:
raise StopIteration 是作为 for 循环结束的标志,当 for 循环接收到这个异常时就会退出循环 ...

为什么平时raise StopIteration会抛出异常。而此处在__next__方法中写入,当 for 循环接收到这个异常时就会退出循环,却不会打印异常信息???这个是为何 我感觉没有太搞明白原因和区别
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-22 16:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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