鱼C论坛

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

[已解决]迭代器 球球了

[复制链接]
发表于 2020-8-24 15:23:50 | 显示全部楼层 |阅读模式

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

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

x
迭代器这一讲里
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

fibs=Fibs(10)
for each in fibs:
    print(each)

有两个问题就是
1.在那个fibs类里面 是因为for 的输入触发了fibs中的__iter__和__next__这两个方法吗??
还是在什么时候将会触发上述两个方法

2.__next__中的raise在这里的作用是什么 求解答
最佳答案
2020-8-24 16:20:38
1、__iter__和__next__这是课迭代对象的迭代器方法。当需要遍历该类对象的时候,会触发这两个函数。
for循环的 each in fibs 就是遍历 Fibs 类的对象 fibs ,因此会触发__iter__和__next__这两个函数。

2、raise主动抛出异常,这里抛出的 StopIteration 是迭代终止异常。在遍历可迭代对象的时候遇到 StopIteration 异常则会认为遍历结束,然后终止迭代。若__next__方法没有抛出 StopIteration 异常,则会是的for循环进入死循环。
在这里也就是当fibs.a>10的时候停止迭代,终止遍历。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-24 15:45:53 | 显示全部楼层
for 循环访问了Fibs类的实例对象,所以触发了两个方法
raise的作用是主动生成一个异常,即:迭代到斐波那契数列a属性大于10的时候抛出异常终止程序
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-24 16:20:38 | 显示全部楼层    本楼为最佳答案   
1、__iter__和__next__这是课迭代对象的迭代器方法。当需要遍历该类对象的时候,会触发这两个函数。
for循环的 each in fibs 就是遍历 Fibs 类的对象 fibs ,因此会触发__iter__和__next__这两个函数。

2、raise主动抛出异常,这里抛出的 StopIteration 是迭代终止异常。在遍历可迭代对象的时候遇到 StopIteration 异常则会认为遍历结束,然后终止迭代。若__next__方法没有抛出 StopIteration 异常,则会是的for循环进入死循环。
在这里也就是当fibs.a>10的时候停止迭代,终止遍历。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-19 03:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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