学习python,到码农博客。

如何理解Python迭代器?

在Python中,很多对象都是可以通过for语句来直接遍历的,例如list、string、dict等等,这些对象都可以被称为可迭代对象。至于说哪些对象是可以被迭代访问的,就要了解一下迭代器相关的知识了。

 

1、迭代协议

由于迭代器自动实现了迭代器协议,而迭代器协议对很多人来说,也是一个较为抽象的概念。所以,为了更好的理解生成器,我们需要简单的回顾一下迭代器协议的概念。

1.1.迭代协议是指:对象需要提供__next__()方法,它要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代

1.2.可迭代对象就是:实现了迭代器协议的对象

1.3.协议是一种约定,可迭代对象实现迭代器协议,Python的内置工具(如for循环,sum,min,max函数等)使用迭代器协议访问对象。

 

举个例子:我们可以使用for循环来遍历数组,所以,我们可以使用for循环来遍历list。如下所示:

for x in [1,2,3]:
    print(x)

运行结果:

1
2
3

 

但是,对Python稍微熟悉一点的朋友应该知道,Python的for循环不但可以用来遍历数组,还可以用来遍历文件对象,假设当前目录下有一个文件,里面存了一个列表,使用for循环把它遍历出来,如下所示:

f = open('tete.txt',encoding='utf8')
for line in f:
    print(line)

运行结果:

[1,2,3]

 

为什么在Python中,文件还可以使用for循环进行遍历呢?这是因为,在Python中,文件对象实现了迭代器协议,for循环并不知道它遍历的是一个文件对象,它只管使用迭代器协议访问对象即可。正是由于Python的文件对象实现了迭代器协议,我们才得以使用如此方便的方式访问文件。

 

2、迭代器

迭代工具:for循环、推导、map等等,迭代工具又分:

2.1、迭代器对象(是已经帮你实现了迭代协议)

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

posted @ 2020-12-18 09:43  码农blog  阅读(253)  评论(0编辑  收藏  举报

学习python,到码农博客。

/* 看板娘 */ /* 粒子吸附*/