Python 迭代器
一、 什么是迭代器
是一组数据结构,可以利用它们的索引从0开始一直“迭代”到序列的最后一个条目。
二、为什么要迭代器
1. 提供了可扩展的迭代器接口
2. 对列表迭代带来了性能上的增强
3. 创建真正的迭代接口,而不是原来的随机对象访问
4. 与所有已经存在的用户定义的类以及扩展的模拟序列和映射的对象向后兼容
5. 迭代非序列集合(映射和文件)时,方便和可读性高
三、如何迭代
迭代器有一个 **next()** 方法的对象,而不是通过索引来计数。
当使用循环机制(for语句)需要下一个项时,调用迭代器的next()方法就可以获得它。条目全部取出后,会引发一个StopIteration异常。
迭代器的限制,不能向后移动,不能回到开始,不能复制一个迭代器,**如果需要再次迭代用一个对象,只能重新创建另一个迭代器对象。**
**reversed()** 将返回一个反序访问的迭代器。
**enumerate()** 通用返回迭代器
**any(),all()** 如果迭代器中某个/全部值都是布尔真的话,则它们返回值为值。
四、使用迭代器
1. 序列
#!/usr/bin/env python
myTuple = (123, 'xyz', 45.67)
i = iter(myTuple)
print (next(i))
print (next(i))
print (next(i))
print (next(i)) #->StopIteration
for i in iter(myTuple):
print (i)
- 字典
#遍历字典
kegends = {
("a", "b"):(1809,1849),
("c", "d"):(1852,1906)
}
# 遍历的是Key
for eachLegend in kegends:
print ("Name:%s\tOccupation:%s" % eachLegend)
遍历key:iterkeys()
遍历value:itervalues()
遍历item:iteritems()
3. 文件
文件对象生成的迭代器会自动调用readline()方法。
#遍历文件
myFile = open('iter_txt.txt', 'r')
for line in myFile:
print(line, end='')
print()
五、可变对象和迭代器
在迭代可变对象的时候修改它们不是一个好的主意;一个序列的迭代器只是记录当前到底第几个元素了,所以如果在迭代的时改变了元素,更新会立即反映到所迭代的条目上。
六、如何创建迭代器
- 对一个对象调用item()就可以创建它的迭代器
iter(iterable)
iter(callable, sentinel)
如果传递的是一个序列,那么就根据索引从0一直迭代到序列结束
如果传入的是自定义的类,这个类需要实现 _ _ iter_ _ ()和 _ _ next()_ _()方法。
如果传递两个参数给iter(), 它会重复地调用callable,直到迭代器的下一个值为sentinel。
7、 代码地址
github:python_cookbook\python_knowledge\iter_knodledge.py