本篇文章给大家带来的内容是关于Python中迭代器和生成器以及列表的介绍(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。
迭代器在 Python 2.2 版本中被加入, 它为类序列对象提供了一个类序列的接口。 Python 的迭代无缝地支持序列对象, 而且它还允许迭代非序列类型, 包括用户定义的对象。即迭代器可以迭代不是序列但表现出序列行为的对象, 例如字典的 key , 一个文件的行, 等等。迭代器有以下特性:
-
提供了可扩展的迭代器接口.
-
对列表迭代带来了性能上的增强.
-
在字典迭代中性能提升.
-
创建真正的迭代接口, 而不是原来的随机对象访问.
-
与所有已经存在的用户定义的类以及扩展的模拟序列和映射的对象向后兼容
-
迭代非序列集合(例如映射和文件)时, 可以创建更简洁可读的代码.
迭代器对象即实现了迭代器协议的对象,在 Python 中,支持迭代器协议就是实现对象的 __iter__() 和 next() 方法(注:在 Python3 中被改为 next 方法)。其中 __iter__() 方法返回迭代器对象本身;next() 方法返回容器的下一个元素,在结尾时引发 StopIteration 异常。
迭代器协议
迭代器协议即实现 __iter__() 与 next() 方法。这两个方法是迭代器最基本的方法,一个用来获得迭代器对象,一个用来获取容器中的下一个元素。对于可迭代对象,可以使用内建函数 iter() 来获取它的迭代器对象:
li = [1, 2]it = it<span style="color:transparent">本文来源gaodai#ma#com搞*!代#%^码网%</span>er(li)print itprint it.next()print it.next()print it.next()
结果如下所示:
<listiterator object at 0xb708aa6c>12Traceback (most recent call last): File "iter.py", line 21, in <module> print it.next()StopIteration
列表(list)本身是可迭代的,通过 iter() 方法可以获得其迭代器对象,然后就可以通过 next() 方法来访问 list 中的元素。当容器中没有可以访问的元素时, next() 方法将会抛出一个 StopIteration 的异常,从而终止迭代器。当我们使用 for 语句的时候,for 语句就会自动的通过 __iter__() 方法来获得迭代器对象,并且通过 next() 方法来获取下一个元素,遇到 StopIteration 异常时会自动结束迭代。
自定义迭代器
自己创建迭代器实际上就是实现一个带有 __iter__() 方法和 next() 方法的类,用该类创建的实例即是可迭代对象。例如我们用迭代器来实现斐波那契数列:
class Fibs: def __init__(self): self.a = 0 self.b = 1 def next(self): self.a, self.b = self.b, self.a + self.b return self.a def __iter__(self): return selffibs = Fibs() // 这将得到一个无穷的数列for f in fibs: if f > 1000: print f break else: print f
这里有一个问题,大多数的序列或者类序列都不是无穷的,所以在达到一定条件后就该终止。因此我们需要在序列或者类序列需要结束时引发 StopIteration 异常:
class MyRange(object): def __init__(self, n): self.idx = 0 self.n = n def __iter__(self): return self def next(self): if self.idx < self.n: val = self.idx self.idx += 1 return val else: raise StopIteration()myRange = MyRange(3)for i in myRange: print i
可迭代对象和迭代器对象
可迭代对象即具有 __iter__() 方法的对象,该方法可获取其迭代器对象。迭代器对象即具有 next() 方法的对象。也就是说,一个实现了 __iter_() 的对象是可迭代的,一个实现了 next() 方法的对象则是迭代器。可迭代对象也可以是迭代器对象,如文件对象。此时可迭代对象自己有 next() 方法,而其 __iter() 方法返回的就是它自己。对于许多内置对象及其派生对象,如 list、dict 等,由于需要支持多次打开迭代器,因此自己并非迭代器对象,需要用 __iter_() 方法返回其迭代器对象,并用迭代器对象来访问其它元素。