有人能告诉我如何理解下面的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