当前位置: 首页 > 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.rkmt.cn/news/1426259.html

相关文章:

  • 2026 行业产品测评:聚氨酯、pert 型、钢套钢蒸汽、内减阻保温钢管厂家产品实测解析 - 栗子测评
  • SAP CS20批量改BOM踩坑记:一个‘工程变更管理’开关引发的血案
  • 足浴会所、棋牌室、酒店专用门!山东安荣门业,消防资质齐全,专业定制防火隔音门、室内套装门、静音门 - 栗子测评
  • Bilibili视频转文字工具:从零到一构建你的智能内容提取系统
  • 2026年5月聚乙烯闭孔泡沫板厂家名单:中缝填缝、伸缩缝嵌缝优质厂商选购指南 - 海棠依旧大
  • 视频去水印工具哪个好用?四款热门小程序推荐
  • AI驱动产品通知内容生成:从提示工程到多场景应用实战
  • 逆向思维:当PLC成为服务器——详解S7-1500的ModbusTCP服务端配置与C#客户端连接测试
  • 2026国内稀土抗菌墙板厂家与UV板厂家实力盘点:外贸工程墙板/稀土抗菌墙板厂家测评 - 栗子测评
  • 揭秘 DDS原理:无中心、自发现、实时可靠的“分布式神经“
  • 别只盯着YOLO!用DETR在‘斑马线+行人+交通灯’数据集上试试Transformer目标检测
  • 2026年度GEO源头厂家服务商避坑指南与选型排行榜 - 品牌报告
  • 2026 防火阻燃密封条厂家车辆轮船设备密封条厂家幕墙密封条厂家实力排行 - 栗子测评
  • AI如何解析犯罪动机:从自然语言处理到伦理挑战
  • 告别老InputSystem!UE5.3+EnhancedInput实战:从零搭建一套可复用的角色控制框架
  • android app已经能正常控制滑动抖音了
  • 2026年泡沫板厂家口碑推荐榜:聚乙烯闭孔泡沫板、伸缩缝填缝板、嵌缝板、泡沫棒、EVA 发泡材料厂家选购指南,产能、工艺、品控多维度实用解析 - 海棠依旧大
  • 多机器人密度控制:基于PDE约束优化实现安全与能量可持续的群体智能
  • Vue3大屏可视化模板:适配多种屏幕、图表可热替换、支持实时数据更新
  • 意外的好处-----opencv可以用来识别抖音的评论区图标
  • 2026 防火阻燃密封条厂家车辆轮船设备密封条厂家幕墙密封条厂家产品性能测评 - 栗子测评
  • 图解DRM框架:用大白话和流程图搞懂CRTC、Plane、Encoder都是干嘛的
  • 告别白纸拍照!用Python+OpenCV一键生成透明背景电子签名(附完整代码)
  • 从‘单打独斗’到‘团队协作’:在GEE里玩转Landsat-8和Sentinel-2数据融合的保姆级流程
  • 兰州火锅食材批发哪家好?2026兰州川渝特色餐饮食材供应商指南:兰州饭店专用红油食材批发+西北中餐火锅食材源头供货 - 栗子测评
  • Azuki Elementals事件复盘:Web3社区信任危机与治理教训
  • 藏友必看!2026北京字画回收TOP5榜单,不同藏品、不同场景精准适配指南 - 品牌排行榜单
  • 苹果设备启用 LE Audio 可期:续航提升、延迟降低,或仍不支持 Auracast
  • 从显卡到SSD:图解PCIe x16、x4、x1插槽到底该怎么选?装机避坑指南
  • YouTube 推 AI 定制推荐功能,能否改变内容创作者流量困境?