这里只讨论一个特殊的方法——__iter__,这个方法是迭代器规则的基础
迭代器规则
迭代的意思就是重复做一些事很多次——就像在循环中做的那样。到现在为止只是在for循环中对序列和字典进行迭代,但实际上也能对其他的对象进行迭代:实现__iter__方法的对象。
__iter__方法返回一个迭代器,所谓的迭代器就是具有next方法(这个方法在调用时不需要任何参数)的对象。在调用next方法时,迭代器会返回它的下一个值。如果next方法被调用,但迭代器没有值可以返回,就会引发一个StopIteration异常。
注意:迭代器规则在Python3.0中有一些变化。在新的规则中,迭代器对象应该实现__next__方法,而不是next。而新的内建函数next可以用于访问这个方法。换句话说,next(it)等同于3.0之前版本中的 it.next()
迭代规则的关键是什么?为什么不使用列表?因为列表的杀伤力太大。如果有可以一个接一个地计算值的函数,那么在使用时可能是计算一个值时获取一个值——而不是通过列表一次性获取所有值。如果有很多值,列表就会占用太多的内存。但还有其他理由:使用迭代器更通用、更简单、更优雅。下面看看一个不用列表的例子。
这里的“列表”是一个斐波那契数列。使用迭代器如下:
1 In [37]: class Fibs:
2 ....: def __init__(self):
3 ....: self.a = 0
4 ....: self.b = 1
5 ....: def next(self):
6 ....: self.a, self.b = self.b, self.a+self.b
7 ....: return self.a
8 ....: def __iter__(self):
9 ....: return self
10 ....:
注意,迭代器实现了__iter__方法,这个方法实际上返回迭代器本身。在很多情况下,__iter__会放到其他的会在for循环中使用的对象中。这样一来,程序就能返回所需的迭代器。此外,推荐使迭代器实现它自己的__iter__方法,然后就能直接在for循环中使用迭代其本身了。
注意:正式的说法是,一个实现了__iter__方法的对象是可迭代的,一个实现了next方法的对象则是迭代器。
1 In [38]: fibs = Fibs()
2
3 In [39]: for i in fibs:
4 ....: if i < 100:
5 ....: print i
6 ....:
7 1
8 1
9 2
10 3
11 5
12 8
13 13
14 21
15 34
16 55
17 89