Python 迭代器
迭代器(Iterator)在Python中是表示一串数据流的对象。它遵循迭代器协议,需要支持__iter__()
和__next__()
方法。Python的内置方法iter()实现了__iter__()
方法。它接收一个可迭代对象,并返回迭代器对象。内置的next()函数在内部调用迭代器的__next__()
方法,返回流中的连续项。当没有更多的数据可用时,会抛出StopIteration异常。
Python在使用集合数据类型(如列表、元组或字符串)时,会默认使用迭代器。这也是为什么这些数据类型被称为可迭代对象。我们通常使用for循环来遍历可迭代对象,如下所示:
Python内置的iter()方法实现了__iter__()
方法。它接收一个可迭代对象并返回迭代器对象。
示例
以下代码从序列类型的列表、字符串和元组中获取迭代器对象。iter()函数还可从字典中返回键迭代器。然而,整数不可迭代,因此会产生TypeError。
它会产生以下 输出 −
迭代器对象具有__next__()
方法。每次调用该方法时,它会返回迭代器流中的下一个元素。当流耗尽时,会引发StopIteration错误。调用next()函数等效于调用迭代器对象的__next__()
方法。
示例
将会产生以下输出−
示例
您可以使用异常处理机制来捕获StopIteration。
它将会产生如下的 输出 −
在Python中定义自定义迭代器类,该类必须定义__iter__()
和__next__()
方法。
在以下示例中,Oddnumbers是一个实现__iter__()
和__next__()
方法的类。在每次调用__next__()
时,数字增加2,从而以范围1到10的奇数流。
示例
它将会产生以下的 输出 –
异步迭代器
Python 3.10版本及其以上增加了两个内建函数aiter()和anext()。aiter()函数返回一个异步迭代器对象。它是传统迭代器的异步对应。任何异步迭代器必须支持__aiter__()
和__anext__()
方法。这些方法由这两个内建函数内部调用。
与传统迭代器一样,异步迭代器提供一系列对象。当流耗尽时,将引发StopAsyncIteration异常。
在下面的示例中,声明了一个异步迭代器类Oddnumbers。它实现了__aiter__()
和__anext__()
方法。在每次迭代中,返回下一个奇数,并等待一秒钟,以便可以异步执行任何其他进程。
与常规函数不同,异步函数称为协程,并通过asyncio.run()方法执行。main()协程包含一个while循环,它连续获取奇数,并在数字超过9时引发StopAsyncIteration。
示例
它将产生以下的 输出 。