【十三】aiter()函数(1) - py3

发布时间 2023-06-01 20:35:53作者: Chimengmeng

【十三】aiter()函数(1) - py3.10+

  • 语法:

    aiter(async_iterable)
    
  • 其中 async_iterable 是一个异步可迭代对象,相当于调用 x.aiter()。

注意:与 iter() 不同,aiter() 没有两个参数的版本。

  • aiter() 和 anext() 调用对象的 aiter() 和 anext()
  • 它们本质上是 iter() 和 next() 的异步等价物。 在大多数情况下,很少需要直接使用新的内置函数, 我们可以直接用async for代替。 async for 循环已经隐式调用了类的 aiteranext 方法。

【1】应用

  • 如果您正在编写的代码以某种方式与异步迭代器交互,那么您只需要显式使用 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)。
    • 在每个元组之前
    • 您将看到由迭代器类打印的两组开始行和结束行
    • 一组用于最终出现在配对结果中的每个值。

【2】示例

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() 函数是一个异步生成器,它为异步列表理解生成值。