1 迭代
迭代就是重复做一件事。
2 什么是迭代器协议
- 迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前退)
- 可迭代对象:实现了迭代器协议的对象(如何实现:对象内部定义一个__iter__()方法)
- 协议是一种约定,可迭代对象实现了迭代器协议,python的内部工具(如for循环,sum,min,max函数等)使用迭代器协议访问对象。
3 迭代器
通常情况下,如list和tuple这类容器,是以序列存储的,存在索引(下标),可以通过索引来遍历。但有一些不存在索引,如无序的set和dict,文件。那我们就该如何遍历。这就需要迭代器了。
迭代器(iterator)是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素(且不依赖索引),每个迭代器对象代表容器中的确定的地址。
迭代器描述的是一个重复的概念。
迭代器的作用:
- 不通过索引将对象里的内容取出来;
- 迭代器就是一个内存地址,next()一次取一个值,同一时刻只有一个值,是惰性计算,更省内存。
缺点:
- 无法获取迭代器的长度,使用不如列表灵活。
- 迭代器是一次性的,只能向后取值。
4 Python中的for循环
对象实现了迭代器协议,就能用for循环所有对象。
换句话就是,能被for遍历的都是可迭代对象。
for循环的本质是:调用可迭代对象的__iter__()方法,将可迭代对象变成迭代器,再每一次循环调用对象的__next__()方法,直到遇到StopIteration,并捕捉该异常。结束for循环。
4.1 先看看不用for,用while遍历迭代是什么怎样的
只要对象本身有__iter__(),就是可迭代的对象。
dic={"a":1,"b":"2","c":3,"d":4}
i=dic.__iter__() #等同于i=iter(dic)
dic.__iter__()返回值i是一个迭代器。
只要是迭代器,都有一个__next__()方法,来返回下一个值,直到遇到StopIteration。
i.__next__() #等价于next(i)
dic={"a":1,"b":"2","c":3,"d":4}
i=dic.__iter__()
while True:
try:
print(next(i))
except StopIteration:
break
result:
a
b
c
d
4.2 python中提供了一个更强大的功能for。
dic={"a":1,"b":"2","c":3,"d":4}
i=dic.__iter__()
for x in i:
print(x)
result:
a
b
c
d
等同于上面的while循环
dic={"a":1,"b":"2","c":3,"d":4}
for x in dic:
print(x)
result:
a
b
c
d
打印的和上面结果一样,也就是说for变量的对象可以是迭代器,也可以是可迭代的对象。for会将要遍历的对象先调用dic=dic.__iter__()转换成迭代器,再遍历出来。
总结:能被for遍历的都是可迭代的对象。
注意:
dic={"a":1,"b":"2","c":3,"d":4}
for x in dic:
print(x)
for x in dic:
print(x)
result:
a
b
c
d
第二次for循环并没有打印,所以说迭代器是一次性的,打印完了就没值了。
5 判断一个对象是否是迭代器或可迭代的对象
需要用到collections模块中的Iterable、Iterator。
from collections import Iterable,Iterator
dic={"a":1,"b":"2","c":3,"d":4}
i=dic.__iter__()
print(isinstance("aaa",Iterable))
print(isinstance("aaa",Iterator))
print("------")
print(isinstance(dic,Iterable))
print(isinstance(dic,Iterator))
print("------")
print(isinstance(i,Iterable))
print(isinstance(i,Iterator))
result:
True
False
------
True
False
------
True
True
http://www.cnblogs.com/linhaifeng/articles/6133014.html#_label2