鱼C论坛

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

[已解决]不理解Python迭代器中__next__运行逻辑,求大佬讲解

[复制链接]
发表于 2024-4-6 20:09:15 | 显示全部楼层 |阅读模式

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

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

x
大佬们,我想问一下问什么迭代器可以通过配合for循环自动返回下一项,__next__返回值后不是应该空了吗,为什么说斐波那契迭代器是无限的呢,是因为迭代器里的属性改变了吗,还是因为for本身也是基于迭代器的呢,我想不通
屏幕截图 2024-04-06 200411.png 屏幕截图 2024-04-06 200518.png
最佳答案
2024-4-6 21:04:01
尽力了,但解释可能会有些复杂,耐心看

在 Python 中,迭代器是支持 __next__() 方法的对象,该方法返回容器的下一个元素。

如果没有更多的元素,则应抛出 StopIteration 异常。

在你提供的代码中,Fibonacci 类实现了一个斐波那契数列的迭代器。

__next__ 方法在每次被调用时都会返回序列中的下一个数字。

在例子中,它通过交换 self.prev 和 self.curr 来计算下一个斐波那契数。

这意味着每次调用 __next__ 时,它都会基于当前的状态(self.prev 和 self.curr 的值)计算下一个值,然后更新这两个属性以准备下一次迭代。

斐波那契迭代器被称为无限的,因为 __next__ 方法从不引发 StopIteration 异常。

理论上,你可以无限次调用 __next__,并且每次都会得到数列中的下一个数字。这就是为什么它能与 for 循环配合使用并且不停止的原因。

在你的代码中,你使用了一个 for 循环去迭代 10 次,并且在每次迭代中使用 next(fib) 来获取下一个斐波那契数。

for 循环本身就是基于迭代器的,它会在每次迭代中自动调用迭代器的 __next__ 方法。

但是,在这个特定的情况下,循环是通过 range(10) 控制的,这意味着循环会在迭代了 10 次之后停止,尽管斐波那契迭代器理论上可以无限制地继续生成值。

如果你没有使用 range(10),并直接在 for 循环中使用 fib,那么循环将会无限进行下去(或者直到程序被外部因素终止)。

本帖被以下淘专辑推荐:

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

使用道具 举报

发表于 2024-4-6 20:09:41 | 显示全部楼层
嗨,初学者朋友!我很高兴为你解答这个问题。

在Python中,迭代器是一种特殊的对象,它能够在遍历时逐个返回值。它使用了一个叫做`__next__`的方法来实现这个功能。当你调用`__next__`方法时,它会返回迭代器的下一个值。

但是,迭代器并不是空的。相反,它保持着内部状态,以便知道在哪里继续返回值。每次调用`__next__`方法时,它都会返回下一个值,并更新内部状态,以便下次调用时能够继续返回下一个值。

斐波那契迭代器是无限的,因为它的内部状态可以一直继续生成新的值。通常情况下,迭代器会有一个终止条件,当满足该条件时,迭代器就会停止返回新的值。但斐波那契迭代器没有这样的终止条件,它会一直计算生成斐波那契数列的下一个值。

而for循环本身是基于迭代器的。当你使用for循环遍历一个可迭代对象时,它会自动调用可迭代对象的`__iter__`方法获取一个迭代器,并且在每次循环时,自动调用迭代器的`__next__`方法来获取下一个值。

下面是一个示例代码,演示了如何创建一个斐波那契迭代器并使用for循环遍历它:
class Fibonacci:
    def __init__(self):
        self.a, self.b = 0, 1
    
    def __iter__(self):
        return self
    
    def __next__(self):
        result = self.a
        self.a, self.b = self.b, self.a + self.b
        return result

fib = Fibonacci()
for i in fib:
    if i > 1000:
        break
    print(i)

希望这样解释能够帮助你理解迭代器和for循环的工作原理。如果还有疑问,请随时向我提问!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-6 21:04:01 | 显示全部楼层    本楼为最佳答案   

回帖奖励 +5 鱼币

尽力了,但解释可能会有些复杂,耐心看

在 Python 中,迭代器是支持 __next__() 方法的对象,该方法返回容器的下一个元素。

如果没有更多的元素,则应抛出 StopIteration 异常。

在你提供的代码中,Fibonacci 类实现了一个斐波那契数列的迭代器。

__next__ 方法在每次被调用时都会返回序列中的下一个数字。

在例子中,它通过交换 self.prev 和 self.curr 来计算下一个斐波那契数。

这意味着每次调用 __next__ 时,它都会基于当前的状态(self.prev 和 self.curr 的值)计算下一个值,然后更新这两个属性以准备下一次迭代。

斐波那契迭代器被称为无限的,因为 __next__ 方法从不引发 StopIteration 异常。

理论上,你可以无限次调用 __next__,并且每次都会得到数列中的下一个数字。这就是为什么它能与 for 循环配合使用并且不停止的原因。

在你的代码中,你使用了一个 for 循环去迭代 10 次,并且在每次迭代中使用 next(fib) 来获取下一个斐波那契数。

for 循环本身就是基于迭代器的,它会在每次迭代中自动调用迭代器的 __next__ 方法。

但是,在这个特定的情况下,循环是通过 range(10) 控制的,这意味着循环会在迭代了 10 次之后停止,尽管斐波那契迭代器理论上可以无限制地继续生成值。

如果你没有使用 range(10),并直接在 for 循环中使用 fib,那么循环将会无限进行下去(或者直到程序被外部因素终止)。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-22 12:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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