Python编程:迭代器协议与遍历,轻松搞定

开发 前端
本篇内容就写这些了,主要介绍了迭代器协议和和迭代器遍历。内容的文字不长,再结合代码能帮助你更好地理解和掌握这些Python编程知识点。

前言

前篇内容的介绍应该能很容易地让我们理解掌握​​Python中的可迭代对象和迭代器(Iterable & Iterator)​​。本次内容我们来进一步介绍迭代器的有关内容。

迭代器协议

在Python中,迭代器(Iterator)对象需要支持以下两个方法,它们一起构成迭代器协议:

1)__iter__():

对象的该方法返回迭代器对象本身。这是要求容器和迭代器与for-in语句一起使用所必需的。你也可以使用内置的iter()函数,该函数实质上是在背后调用了__iter__()方法的。

2)__next__():

从迭代器中返回下一项。如果没有其他项,则抛出StopIteration异常。也可以使用内置的next()函数读取下一项,其实质也是调用__next__()方法。

正如我们在前所讲过的,列表、元组、字典和集合都是可迭代类型。换句话说,它们是可以从中获得迭代器的类型。看示例:

代码片段清单-01

输入结果如下:

A
B
C

在示例代码中,我们定义了一个可迭代元组。然后对这个可迭代对象调用iter()函数。iter()函数返回一个迭代器,我们将其命名为tupIter。然后多次调用next()函数。next()函数每次执行时,都会自动返回迭代器中的下一项。

再看下一段示例代码:

代码片段-02

运行输出的结果为:

P
y

在上述代码清单中,在字符串对象上调用__ iter__()方法。字符串对象实现了迭代器协议,所以字符串是包含字符序列的可迭代对象的。直接调用__ iter__()方法就可返回一个迭代器。然后再通过返回的迭代器调用__ next__()方法,就可一个一个地输出迭代器中的元素内容。

一言以蔽之,只要实现了迭代器协议的对象,即可按照上面的两种方法进行对象的迭代调用。

迭代器遍历

正如我们在前介绍中看到的,我们使用next()函数(或__next__()方法)手动遍历迭代器的项。当next()函数到达迭代器的末尾时,就没有更多的数据要返回,将得到一个StopIteration异常。

请看示例:

代码片段清单-03

运行上述程序,输出结果类似如下:

10

20

30

Traceback (most recent call last):

File ……, in <module>

print(next(listIter))

StopIteration

在上述代码中,调用了next()函数四次,这比迭代器中的项数还要多。在最后一个调用中得到了抛出的StopIteration异常——因为迭代器内元素项已经迭代完了。而且,为保证手动迭代完成后可能抛出的异常,得自行进行异常处理,否则后续将不再正常执行。

需要认识到的是:绝大多数场景下,我们不需要自己手动调用next方法,Python中的for循环能够自动遍历任何可以返回迭代器的对象。换句话说,for循环可以遍历Python中的任何可迭代对象。

请看示例:

代码清单片段04

在上述代码中,我们使用for循环遍历前面定义的列表。显而易见,我们没有手动使用next()函数,也没有获得任何StopIteration异常。这就是Python中for循环的美妙之处。它在幕后为我们处理所有这些。

当然,我们可以自行这样来处理循环迭代。现在定义一个我们自己的for循环版本。我们将使用while循环并复制for循环的行为。在此,我们自己构建该实现所需的一切。如下所示:

代码清单片段-05

在上述清单中,我们实现了自己版本的模拟for循环。代码中使用无限while循环:while True。在循环中设置了一个try-except块。在try块中,通过调用迭代器上的__next__()方法获得下一个元素。如果调用成功,则打印出该元素。如果发生了StopIteration类型的错误,则在except块中捕获该异常。在except块中所做的事情非常简单。我们只是跳出这个循环,这意味着我们已经到达迭代器的末端。

小结

本篇内容就写这些了,主要介绍了迭代器协议和和迭代器遍历。内容的文字不长,再结合代码能帮助你更好地理解和掌握这些Python编程知识点。

责任编辑:武晓燕 来源: 今日头条
相关推荐

2022-10-26 08:25:06

Python编程迭代器

2021-11-28 08:03:41

Python迭代器对象

2023-11-07 10:10:36

设计模式元素

2020-05-11 10:59:02

PythonWord工具

2010-09-13 14:17:34

2016-03-28 10:39:05

Python迭代迭代器

2009-08-19 15:18:53

迭代器

2009-11-24 15:34:41

DNS服务器组建

2009-02-16 15:35:00

2020-11-24 08:00:22

JavaScript对象迭代器

2022-09-16 08:04:25

阿里云权限网络

2009-11-13 17:32:37

2010-03-15 12:50:19

Python文件夹创建

2009-11-20 16:50:02

无线路由器

2013-10-17 13:16:47

2009-10-23 17:51:51

Oracle用户密码

2010-09-17 14:04:14

JVM内存设置

2009-12-11 15:37:58

Linux日志处理

2017-05-11 15:01:43

Androidweb布局

2019-05-05 09:46:01

Python代码神经网络
点赞
收藏

51CTO技术栈公众号