Python 迭代器

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

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程