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

liftword4个月前 (12-19)技术文章60

前言

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

并请各位读者朋友们记得 点赞、转发和关注@传新视界 谢谢了先 ^_^

迭代器协议

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

1)__iter__():

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

2)__next__():

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

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

输入结果如下:

A

B

C

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

再看下一段示例代码:

运行输出的结果为:

P

y

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

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

迭代器遍历

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

请看示例:

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

10

20

30

Traceback (most recent call last):

File ……, in <module>

print(next(listIter))

StopIteration

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

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

请看示例:

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

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

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

小结

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

下一篇内容将介绍如何自定义迭代器?是否可以实现无限迭代?使用迭代器的好处有哪些?

[谢谢]敬请关注,点个赞,转发出去吧,谢谢了^_^[谢谢]

相关文章

python入门009:遍历列表 遍历列表 python

一、遍历列表遍历,简单理解就是对每个数据都过一遍。1、简单遍历在程序中,有时需要遍历列表中的所有元素,对每个元素都执行相同的操作。例如,想要逐个显示列表中的人名元素,这时可以通过使用for循环实现列表...

Python 中的列表推导式详解 python列表讲解

· 在 Python 中,列表推导式是一种简洁而富有表现力的方式,通过以紧凑的语法指定元素和条件来创建数据结构,如列表、字典和集合,通常使用单行代码,而不是使用传统的循环和附加操作。 在 Python...

Python 中如何逐行将文件内容读入列表

在 Python 中将文件内容逐行读取到列表中,可以使用 with 关键字利用 readlines()方法、循环、列表推导式等方法来完成。使用 readlines() 逐行读取文件# 使用readli...

Python里for循环要遍历的数据很多很大怎么办?

#春日生活打卡季#首先面对这个问题,对于初学者来说了解基础的数据结构是非常重要的。掌握了数据结构在去分析相应的程序执行效率,这才是学编程的第一步。在《数据结构》这门学科中,栈、队列属于是逻辑结构,其...

你想不到的,那些在 Python 中输出列表的技巧

知道有很多方法可以在 Python 中输出列表吗?本文将探讨在 Python 中输出列表的一些技巧。Python 中的 print() 函数是大家经常使用的内置函数,可以方便的输出列表,但下面列举的使...