当前位置: 首页 > news >正文

Python异步迭代器协议

【Python 异步迭代器协议】
==========================

异步迭代器通过 __aiter__ 和 __anext__ 协议实现,配合
async for 循环使用。还包括异步生成器和异步推导式。

──────────────────────────────────────────────
示例 1:自定义异步迭代器
──────────────────────────────────────────────

import asyncio

class 异步数字范围:
"""异步迭代器,模拟 range 但每次 yield 前异步等待"""

def __init__(self, 开始, 结束, 延迟=0.5):
self.当前 = 开始
self.结束 = 结束
self.延迟 = 延迟

def __aiter__(self):
"""返回异步迭代器自身"""
print("开始异步迭代")
return self

async def __anext__(self):
"""异步获取下一个值"""
if self.当前 >= self.结束:
raise StopAsyncIteration # 停止迭代

await asyncio.sleep(self.延迟) # 模拟异步操作
值 = self.当前
self.当前 += 1
return 值

async def 自定义迭代器示例():
"""使用 async for 遍历异步迭代器"""
async for 数字 in 异步数字范围(1, 5, 0.3):
print(f"获取到: {数字}")

asyncio.run(自定义迭代器示例())

──────────────────────────────────────────────
示例 2:异步生成器
──────────────────────────────────────────────

import asyncio

async def 异步斐波那契(上限):
"""异步生成器:生成斐波那契数列"""
a, b = 0, 1
while a < 上限:
await asyncio.sleep(0.2) # 每次生成前异步等待
yield a
a, b = b, a + b

async def 异步数据流():
"""模拟从外部源获取数据流"""
for i in range(10):
await asyncio.sleep(0.1)
yield f"数据包-{i}"

async def 生成器示例():
"""使用 async for 消费异步生成器"""
print("=== 斐波那契数列 ===")
async for 值 in 异步斐波那契(20):
print(f"斐波那契: {值}")

print("\n=== 数据流 ===")
async for 数据 in 异步数据流():
print(f"收到: {数据}")

asyncio.run(生成器示例())

──────────────────────────────────────────────
示例 3:异步列表推导式
──────────────────────────────────────────────

import asyncio

async def 异步乘法器(因子):
"""异步生成器"""
for i in range(5):
await asyncio.sleep(0.1)
yield i * 因子

async def 异步推导式示例():
"""使用异步推导式收集结果"""

# 异步列表推导式
结果 = [值 async for 值 in 异步乘法器(3)]
print(f"列表推导: {结果}")

# 异步集合推导式
结果集合 = {值 async for 值 in 异步乘法器(2)}
print(f"集合推导: {结果集合}")

# 异步字典推导式
结果字典 = {
f"键-{值}": 值
async for 值 in 异步乘法器(5)
if 值 > 5 # 支持条件过滤
}
print(f"字典推导: {结果字典}")

# 异步生成器表达式(返回异步生成器)
异步生成器 = (值 async for 值 in 异步乘法器(4))
async for 值 in 异步生成器:
print(f"生成器表达式: {值}")

asyncio.run(异步推导式示例())

──────────────────────────────────────────────
示例 4:异步迭代器实现分页
──────────────────────────────────────────────

import asyncio

class 异步分页器:
"""模拟异步分页 API 数据获取"""

def __init__(self, 总页数, 每页大小=10):
self.总页数 = 总页数
self.每页大小 = 每页大小
self.当前页 = 0

async def _获取页(self, 页码):
"""模拟异步 API 调用获取一页数据"""
await asyncio.sleep(0.3)
return [
f"数据-{页码}-{i}" for i in range(self.每页大小)
]

def __aiter__(self):
return self

async def __anext__(self):
if self.当前页 >= self.总页数:
raise StopAsyncIteration
self.当前页 += 1
数据 = await self._获取页(self.当前页)
return self.当前页, 数据

async def 分页示例():
"""使用 async for 遍历分页数据"""
async for 页码, 数据 in 异步分页器(3, 5):
print(f"第{页码}页: 共{len(数据)}条")
for 项 in 数据[:2]: # 只显示前 2 条
print(f" {项}")

asyncio.run(分页示例())

──────────────────────────────────────────────
核心要点
──────────────────────────────────────────────
• __aiter__ - 返回异步迭代器对象
• __anext__ - 返回 awaitable,结束时抛 StopAsyncIteration
• async for - 遍历异步迭代器的语法糖
• async def 生成器 + yield - 异步生成器
• async for...in...if 推导式 - 异步推导式
• 异步迭代器适合分页查询、数据流、事件流等场景

http://www.jsqmd.com/news/914951/

相关文章:

  • 2026 防洪防汛河堤景观护坡类石笼网厂商及生产厂家综合实力榜单汇总 - 栗子测评
  • 告别TeamViewer!用C++和libvncserver从零打造一个轻量级Linux远程桌面(附完整源码)
  • 2026年EPP玩具模型价格排名,哪家性价比高? - mypinpai
  • 小众选题发文有多香?NHANES高雄激素血症指标上线,高分模板直接用!
  • 告别编译噩梦:用 CP2K 官方 Toolchain 脚本在 Ubuntu 上自动化部署(含 MKL 和 GCC 配置)
  • 2026 产品测评汇总沟盖板踏步板源头厂家光伏走道板插接平台钢格板厂家解析 - 栗子测评
  • 从实验室到真实世界:翻译AI性能评估的范式转变与实践体系构建
  • 从‘免调度’到‘导频污染’:无线通信工程师眼中的NOMA实战避坑指南
  • SAP CS20批量改BOM踩坑记:一个‘工程变更管理’开关引发的血案
  • 2026 行业产品测评:聚氨酯、pert 型、钢套钢蒸汽、内减阻保温钢管厂家产品实测解析 - 栗子测评
  • 亚马逊网络设计重大突破:提升数据传输速度、降低能耗,或在云竞赛中占优
  • 告别raspistill!树莓派4B新手必看:用libcamera玩转CSI摄像头(附VNC黑屏修复)
  • ArcGIS Pro 3.x 用户看过来:手把手教你打造专属‘栅格批量工具箱’,告别Model Builder的繁琐
  • 2026年国产多普勒流量计十大品牌权威排名与选型终极指南 - 仪表品牌排行榜
  • 2026年最新|应对Turnitin严查:英文论文AI率95%降至0%亲测,5款工具与手改全指南 - 降AI实验室
  • 足浴会所、棋牌室、酒店专用门!山东安荣门业,消防资质齐全,专业定制防火隔音门、室内套装门、静音门 - 栗子测评
  • ADS1262/ADS1263高精度ADC嵌入式驱动包:C++封装,支持双通道采集、IDAC配置与系统校准
  • 告别寄存器!用STM32CubeMX图形化配置FSMC驱动3.5寸ILI9488屏(STM32F407VET6)
  • Bilibili视频转文字工具:从零到一构建你的智能内容提取系统
  • PotPlayer播放4K HDR电影画面发灰?可能是MadVR和LAV没设对(附详细排查步骤)
  • Unity粒子系统避坑指南:从性能优化到常见Bug,让你的特效不再卡顿和穿模
  • 2026年应对Turnitin检测:英文降AI率实操指南,3个方法教你从95%降至8% - 降AI实验室
  • 读工业软件简史05仿真和流程
  • 用Python和NumPy手把手教你计算多元高斯分布的概率密度(附完整代码)
  • 从‘样式混乱’到‘完美适配’:手把手教你解决Vant Weapp在小程序中的样式覆盖难题
  • 用Python+OpenCV+MySQL从零搭建一个带情绪分析的人脸考勤系统(附完整源码)
  • 2026年5月聚乙烯闭孔泡沫板厂家名单:中缝填缝、伸缩缝嵌缝优质厂商选购指南 - 海棠依旧大
  • 2026国内超声波清洗机源头厂家-超声波清洗设备/实验室超声波清洗机选购测评 - 栗子测评
  • AR翻译技术解析:从OCR到NMT,构建无缝跨语言交互体验
  • 视频去水印工具哪个好用?四款热门小程序推荐