有人能告诉我如何理解下面的python程序吗(我们用iter()做什么?)

有人能告诉我如何理解下面的python程序吗(我们用iter()做什么?),python,Python,有人能告诉我怎么会这样吗 我有一个这样的程序: class Fib(object): def __init__(self): self.a, self.b = 0, 1 def __iter__(self): return self def next(self): self.a, self.b = self.b, self.a + self.b if self.a > 100000:

有人能告诉我怎么会这样吗

我有一个这样的程序:

class Fib(object):

    def __init__(self):
        self.a, self.b = 0, 1 

    def __iter__(self):
        return self 

    def next(self):
        self.a, self.b = self.b, self.a + self.b 
        if self.a > 100000:
            raise StopIteration();
        return self.a 
如果我进入:

>>> for n in Fib():
...     print n
输出为:

1
1
2
3
5
...
46368
75025
问题是我不知道
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

完全糊涂了吗?杰出的让我们看看怎么称呼这个 迭代器:

from fibonacci2 import Fib
for n in Fib(1000): 
    print n,
01 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987

下面是发生的情况:

for循环调用Fib(1000),如图所示。这将返回Fib类的一个实例。这叫谎言。 for循环秘密地、非常巧妙地调用iter(fib_inst),它返回一个迭代器对象。称之为谎言。在这种情况下,, fib_iter==fib_inst,因为iter()方法返回self,但是 for循环并不知道(或关心)这一点。 为了“循环”迭代器,for循环调用next(fib_iter),它调用fib_iter对象上的next()方法,该方法 下一个斐波那契数计算并返回一个值。为 循环获取该值并将其分配给n,然后执行 该值n的for循环。 for循环如何知道何时停止?我很高兴你问我!当next(fib_iter)引发StopIteration异常时,for循环将 吞下异常并优雅地退出。(任何其他例外情况将被视为 (像往常一样经过并被举起。)你在哪里见过一只猫
停止迭代异常?当然,在下一个()方法中

Python有迭代器,类似于Java的迭代器和C#的IEnumerable(T)

请阅读以下内容:


在Python中,有iterables和迭代器的概念。松散地说,iterable是任何使用iter方法的东西。列表就是一个例子。在此列表上运行for循环时,请说:

for i in range(5): print i 对于范围(5)中的i: 打印i Python返回一个迭代器,该迭代器自动调用生成所有结果

现在迭代器(不要与iterables混淆)本身就是任何具有iter函数和next方法的对象。当这个迭代器循环时,它在每个循环上调用next方法,这基本上产生下一个输出,就像for循环产生范围内的输出一样

next调用到达最后一个元素时,将引发StopIteration错误,从而结束循环。这非常类似于for循环在幕后的工作方式


简而言之,您的代码所做的是创建一个迭代器,并定义每次迭代器想要获取下一个值(即next()方法)时会发生什么。

这个问题有一个python-2.7标记。编辑您的代码可能会有帮助。因此,与其使用
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuoself(self)
不如使用
下一步(self)
从未来导入,然后循环连续调用next(),而不再次调用_iter _;(),对吗?因此,只调用了一次(在开始时),然后程序只关心next()函数,对吗?有点像。在序列(iterable)上调用_iter__时,它返回一个listiterator对象。这个对象一直在调用next()方法,直到出现StopIteration错误,这意味着不再有next值 for i in range(5): print i