说明
《Python 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gr99123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
aiter() 是 Python 3.10 版本中的一个新函数。它返回一个异步可迭代对象的异步迭代器。
aiter() 函数的语法如下所示:
aiter(async_iterable)
其中 async_iterable 是一个异步可迭代对象,相当于调用 x.__aiter__()
。
注意:与 iter() 不同,aiter() 没有两个参数的版本。
与常规同步迭代器 iter() 和 next() 内置函数一样,您很少需要直接使用新的内置函数。 async for 循环已经隐式调用了类的 __aiter__
和 __anext__
方法。
aiter() 和 anext() 调用对象的 __aiter__()
和 __anext__()
,如果它们存在的话。它们本质上是 iter() 和 next() 的异步等价物。 在大多数情况下,您只想简单地使用 async for 来代替。
如果您正在编写的代码以某种方式与异步迭代器交互,那么您只需要显式使用 aiter 和 anext,而这种方式不被 async for 循环直接支持。 例如,这是一个异步生成器,它从给定的可迭代对象中产生成对的值:
async def pairwise(aiterable, default=None):
# 获取对迭代器的引用
ait = aiter(aiterable)
# 得到一个额外的值,产生一个 2 元素元组
async for x in ait:
yield x, await anext(ait, default)
如果您在 main 函数中循环使用 pairwise(AIter(10)),您会发现它现在打印数字元组,例如 finally (0, 1)。 在每个元组之前,您将看到由迭代器类打印的两组开始行和结束行,一组用于最终出现在配对结果中的每个值。
以下是示例:
import asyncio
async def numbers(nums):
for i in range(nums):
yield i
await asyncio.sleep(0.5)
# 隐式使用
[i async for i in numbers(10) if i % 2 == 0]
# 显式使用
[i async for i in aiter(numbers(10)) if i % 2 == 0]
# [0, 2, 4, 6, 8]
a = aiter(numbers(10))
dir(a)
'''
['__aiter__',
'__anext__',
'__class__',
...
'''
在上面的代码中,numbers() 函数是一个异步生成器,它为异步列表理解生成值。
更新时间:2022-06-15 10:56:53 标签:python 异步 迭代器