鱼C论坛

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

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

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

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

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

x
本帖最后由 wxq199459 于 2017-3-18 10:56 编辑
  1. class Fibs:
  2.     def __init__(self,n=20):
  3.         self.a=0
  4.         self.b=1
  5.         self.n=n
  6.     def __iter__(self):
  7.        return self
  8.     def __next__(self):
  9.        self.a,self.b = self.b,self.a + self.b
  10.        if self.a > self.n:
  11.            raise StopIteration
  12.        return self.a
复制代码


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

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

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

  5.     def __iter__(self):
  6.         return self

  7.     def isLY(self,year):
  8.         if ((year%4==0 and year%100!=0) or (year%400 == 0)):
  9.             return 1
  10.         else:
  11.             return 0

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

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

  17.         return temp
复制代码


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

希望大佬能来说明一下,不胜感激!!!等级不够没法发悬赏
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-3-18 13:43:37 | 显示全部楼层
自顶一下
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-5-4 14:31:58 | 显示全部楼层
return 是temp啊
第二次self.now-1 是作为下一次迭代的初始值把
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

那岂不是减了两次1
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

发表于 2020-3-4 16:24:50 | 显示全部楼层
楼主明白了吗 第一个问题 为何不会抛出异常?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-19 02:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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