在Python中,不少对象都是能够经过for语句来直接遍历的,例如list、string、dict等等,这些对象均可以被称为可迭代对象。至于说哪些对象是能够被迭代访问的,就要了解一下迭代器相关的知识了。web
一、迭代协议数组
因为迭代器自动实现了迭代器协议,而迭代器协议对不少人来讲,也是一个较为抽象的概念。因此,为了更好的理解生成器,咱们须要简单的回顾一下迭代器协议的概念。app
1.1.迭代协议是指:对象须要提供__next__()方法,它要么返回迭代中的下一项,要么就引发一个StopIteration异常,以终止迭代函数
1.2.可迭代对象就是:实现了迭代器协议的对象工具
1.3.协议是一种约定,可迭代对象实现迭代器协议,Python的内置工具(如for循环,sum,min,max函数等)使用迭代器协议访问对象。测试
举个例子:咱们可使用for循环来遍历数组,因此,咱们可使用for循环来遍历list。以下所示:spa
for x in [1,2,3]: print(x)
运行结果:code
1 2 3
可是,对Python稍微熟悉一点的朋友应该知道,Python的for循环不但能够用来遍历数组,还能够用来遍历文件对象,假设当前目录下有一个文件,里面存了一个列表,使用for循环把它遍历出来,以下所示:orm
f = open('tete.txt',encoding='utf8') for line in f: print(line)
运行结果:对象
[1,2,3]
为何在Python中,文件还可使用for循环进行遍历呢?这是由于,在Python中,文件对象实现了迭代器协议,for循环并不知道它遍历的是一个文件对象,它只管使用迭代器协议访问对象便可。正是因为Python的文件对象实现了迭代器协议,咱们才得以使用如此方便的方式访问文件。
二、迭代器
迭代工具:for循环、推导、map等等,迭代工具又分:
2.一、迭代器对象(是已经帮你实现了迭代协议)
2.二、可迭代对象(列表,用for循环、推导、map也能实现,可是中间夹着一个额外的方法叫iter(),用于生成迭代器,用for循环、推导等等的时候它给列表调用了iter()的方法,帮咱们实现了next的功能,调用iter的时候内部会生成一个__iter__(),__iter__这个方法又帮咱们生成了__next__(),因此它就支持迭代了)
查看文件是否实现了iter迭代器功能:
f = open('tete.txt',encoding='utf8') print(iter(f) is f) # 测试对象自己是否带有迭代器的功能,返回True或False
运行结果:
True
返回True就说明了文件自己已经实现了iter迭代器的功能。
本身生成迭代器(无论是用for仍是__next__(),只能迭代一次,还要迭代要从新链接文件):
lis = [1,2,3] i = iter(lis) # 经过iter函数将迭代对象转换成迭代器, print(i.__next__()) print(i.__next__()) print(i.__next__())
运行结果:
1 2 3
若是多加一个print(i.__next__()),那就会报出一个StopIteration的异常。
手动迭代的方式:
lis = [1,2,3] shu = [] i = iter(lis) while True: try: x = shu.append(next(i)**2) # next方法遍历获得的i变量的结果,计算平方值,追加到shu列表里 except StopIteration: # 捕获一个异常叫StopIteration的时候 break # 就跳出循环 print(shu)
运行结果:
[1, 4, 9]
本文转自:https://www.myblou.com/archives/1489