Python 迭代器
迭代器(Iterator)在Python中是表示一串数据流的对象。它遵循迭代器协议,需要支持__iter__()
和__next__()
方法。Python的内置方法iter()实现了__iter__()
方法。它接收一个可迭代对象,并返回迭代器对象。内置的next()函数在内部调用迭代器的__next__()
方法,返回流中的连续项。当没有更多的数据可用时,会抛出StopIteration异常。
Python在使用集合数据类型(如列表、元组或字符串)时,会默认使用迭代器。这也是为什么这些数据类型被称为可迭代对象。我们通常使用for循环来遍历可迭代对象,如下所示:
for element in sequence:
print (element)
Python内置的iter()方法实现了__iter__()
方法。它接收一个可迭代对象并返回迭代器对象。
示例
以下代码从序列类型的列表、字符串和元组中获取迭代器对象。iter()函数还可从字典中返回键迭代器。然而,整数不可迭代,因此会产生TypeError。
print (iter("aa"))
print (iter([1,2,3]))
print (iter((1,2,3)))
print (iter({}))
print (iter(100))
它会产生以下 输出 −
<str_ascii_iterator object at 0x000001BB03FFAB60>
<list_iterator object at 0x000001BB03FFAB60>
<tuple_iterator object at 0x000001BB03FFAB60>
<dict_keyiterator object at 0x000001BB04181670>
Traceback (most recent call last):
File "C:\Users\user\example.py", line 5, in <module>
print (iter(100))
^^^^^^^^^
TypeError: 'int' object is not iterable
迭代器对象具有__next__()
方法。每次调用该方法时,它会返回迭代器流中的下一个元素。当流耗尽时,会引发StopIteration错误。调用next()函数等效于调用迭代器对象的__next__()
方法。
示例
it = iter([1,2,3])
print (next(it))
print (it.__next__())
print (it.__next__())
print (next(it))
将会产生以下输出−
1
2
3
Traceback (most recent call last):
File "C:\Users\user\example.py", line 5, in <module>
print (next(it))
^^^^^^^^
StopIteration
示例
您可以使用异常处理机制来捕获StopIteration。
it = iter([1,2,3, 4, 5])
print (next(it))
while True:
try:
no = next(it)
print (no)
except StopIteration:
break
它将会产生如下的 输出 −
1
2
3
4
5
在Python中定义自定义迭代器类,该类必须定义__iter__()
和__next__()
方法。
在以下示例中,Oddnumbers是一个实现__iter__()
和__next__()
方法的类。在每次调用__next__()
时,数字增加2,从而以范围1到10的奇数流。
示例
class Oddnumbers:
def __init__(self, end_range):
self.start = -1
self.end = end_range
def __iter__(self):
return self
def __next__(self):
if self.start < self.end-1:
self.start += 2
return self.start
else:
raise StopIteration
countiter = Oddnumbers(10)
while True:
try:
no = next(countiter)
print (no)
except StopIteration:
break
它将会产生以下的 输出 –
1
3
5
7
9
异步迭代器
Python 3.10版本及其以上增加了两个内建函数aiter()和anext()。aiter()函数返回一个异步迭代器对象。它是传统迭代器的异步对应。任何异步迭代器必须支持__aiter__()
和__anext__()
方法。这些方法由这两个内建函数内部调用。
与传统迭代器一样,异步迭代器提供一系列对象。当流耗尽时,将引发StopAsyncIteration异常。
在下面的示例中,声明了一个异步迭代器类Oddnumbers。它实现了__aiter__()
和__anext__()
方法。在每次迭代中,返回下一个奇数,并等待一秒钟,以便可以异步执行任何其他进程。
与常规函数不同,异步函数称为协程,并通过asyncio.run()方法执行。main()协程包含一个while循环,它连续获取奇数,并在数字超过9时引发StopAsyncIteration。
示例
import asyncio
class Oddnumbers():
def __init__(self):
self.start = -1
def __aiter__(self):
return self
async def __anext__(self):
if self.start >= 9:
raise StopAsyncIteration
self.start += 2
await asyncio.sleep(1)
return self.start
async def main():
it = Oddnumbers()
while True:
try:
awaitable = anext(it)
result = await awaitable
print(result)
except StopAsyncIteration:
break
asyncio.run(main())
它将产生以下的 输出 。
1
3
5
7
9