Python iterable, iter(), __iter__, iterator, itertools
来源:互联网 发布:骰子模拟器 mac版 编辑:程序博客网 时间:2024/04/29 09:09
简述
迭代器是在版本2.2被加入到Python的,它为类序列对象提供了一个类序列的接口。Python的迭代无缝地支持序列对象,而且它还允许迭代非序列类型,包括用户定义的对象。
迭代器用起来很灵巧,可以迭代不是序列但表现出序列行为的对象,例如字典的键、一个文件的行等等。使用循环迭代一个对象条目时,几乎分辨不出它是迭代器还是序列。开发者不必关注这些,因为Python让它像一个序列那样操作。
迭代器的作用
- 提供了刻扩展的迭代器接口;
- 对列表迭代带来了性能上的增强;
- 在字典迭代中性能提升;
- 创建真正的迭代接口,而不是原来的随即对象访问;
- 与所有已经存在的用户定义的类以及扩展得模拟序列和映射的对象向后兼容;
- 迭代非序列集合(例如映射和文件)时,可以创建更简洁可读的代码。
示例
>>> a = [122, 221, 333]>>> b = iter(a)>>> b.next()122>>> b.next()221>>> b.next()333>>> b.next() # 迭代到末尾时触发 StopIteration 异常Traceback (most recent call last): File "", line 1, in ?StopIteration
iterable 与 iterator
在Python里iterable被认为是一类对象,这类对象能够一次返回它的一个成员(也就是元素)。抽象一点就是适合迭代的对象。实际上,任何具有iter()或getitem()方法的对象,Python就认为它是一个iterable。
Python里有大量内置的iterable类型,如: list,str,tuple,dict,file,xrange等。使用内置的iter()函数来生成iterator。即:
iter(iterable) -> iterator object
iterator(迭代器)存在于众多面向对象的程序设计语言中,它是一种经典的设计模式。迭代器模式提供一种访问有序访问聚合对象里元素的方法。具体到Python语言里,iterator对象就是且必须实现了迭代协议(iterator protocol)的对象。Python里的iterator实现了两个方法:
__iter__() # 返回迭代器本身__next__()
深入 iterable 与 __iter__
迭代器以类的方式实现,如下是一个类似内置xrange()方法的迭代器。
class yrange: def __init__(self, n): self.i = 0 self.n = n def __iter__(self): return self def next(self): if self.i < self.n: i = self.i self.i += 1 return i else: raise StopIteration()
其中 __iter__ 方法使对象可迭代,iter() 调用了给定对象的 __iter__ 方法,__iter__ 的返回值则是个迭代器。
>>> y = yrange(3)>>> y.next()0>>> y.next()1>>> y.next()2>>> y.next()Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 14, in nextStopIteration
很多内置的其它方法都支持迭代器,比如:
>>> list(yrange(5))[0, 1, 2, 3, 4]>>> sum(yrange(5))10
上面的例子中,iterable(可迭代对象)和iterator(迭代器)是同一个对象,因为 __iter__ 方法返回了它本身。但不一定一直如此,如下示例:
class zrange: def __init__(self, n): self.n = n def __iter__(self): return zrange_iter(self.n)class zrange_iter: def __init__(self, n): self.i = 0 self.n = n def __iter__(self): # Iterators are iterables too. # Adding this functions to make them so. return self def next(self): if self.i < self.n: i = self.i self.i += 1 return i else: raise StopIteration()
如果迭代对象和迭代器本身是同一个对象,那么在一次迭代过程中会被消耗掉。
>>> y = yrange(5)>>> list(y)[0, 1, 2, 3, 4]>>> list(y)[]>>> z = zrange(5)>>> list(z)[0, 1, 2, 3, 4]>>> list(z)[0, 1, 2, 3, 4]
itertools
itertools 是一个高效创建迭代器的方法库,主要方法如下:
无限迭代器:
在最短输入序列终止的迭代器:
组合生成器:
参考
http://anandology.com/python-practice-book/iterators.html#the-iteration-protocol
http://www.cnblogs.com/Simon-xm/p/3979161.html
https://docs.python.org/2/library/itertools.html
liaoxuefeng.com : itertools
- Python iterable, iter(), __iter__, iterator, itertools
- 迭代器(关键词:Python/iterator/iterable/__iter__/next)
- Iterators(关键词:Python/iterator/iterable/__iter__/next)
- python迭代器:iter()和__iter__()
- Python学习笔记(5) -- 迭代器(Iterable/Iterator/iter())
- python 3-1 如何实现可迭代对象iterable和迭代器对象iterator,__iter__,__getitem__
- python Iterable和Iterator
- PYTHON: iterator & iterable & sequence
- Python iterator和iterable
- Python学习Iterable和Iterator
- Python学习之iterable&iterator
- Python中Iterable与Iterator
- Python的iterable与iterator
- python的iterator/iterable/generator
- python类中的__iter__, __next__与built-in的iter()函数举例
- iterator, __iter__, __next__
- Python 中 Iterator和Iterable的区别
- Python学习笔记:iterator和iterable
- 【华为 OJ】 提取不重复的整数
- recycleview获取第一个和最后一个可见item的位置
- 动态设置ListView组建的高度
- python爬虫(python下载20160804)
- 安装vsftpd
- Python iterable, iter(), __iter__, iterator, itertools
- Android 四种加载方式详解
- android developer tiny share-20160803
- 《高性能MySQL(第3版)》之切分查询
- PHP 初识 随笔记录
- 控制物体随鼠标旋转
- freemarker页面如何获取绝对路径basePath
- php://input,$_POST,$HTTP_RAW_POST_DATA区别
- iOS常用的一些第三方