Python.二.(三).迭代器和生成器
Python 中迭代器的概念核心结论可迭代对象Iterable实现__iter__迭代器Iterator实现__iter____next__。迭代器是带状态的惰性求值对象 。我们来看一个from collections import Iterable print(isinstance(abcddddd, Iterable)) # str是否可迭代 print(isinstance([1,2,3,4,5,6], Iterable)) # list是否可迭代 print(isinstance(12345678, Iterable)) # 整数是否可迭代 -------------结果如下---------------- True True False当对所有的可迭代对象调用 dir() 方法时会发现他们都实现了 iter 方法。这样就可以通过 iter(object) 来返回一个迭代器。x [1, 2, 3] y iter(x) print(type(x)) print(type(y)) ------------结果如下------------ class list class list_iterator可以看到调用iter()之后变成了一个list_iterator的对象。可以发现增加了一个__next__方法。所有实现了__iter__和__next__两个方法的对象都是迭代器。迭代器是带状态的对象它会记录当前迭代所在的位置以方便下次迭代的时候获取正确的元素。__iter__返回迭代器自身__next__返回容器中的下一个值如果容器中没有更多元素了则抛出Stoplteration异常。x [1, 2, 3] y iter(x) print(next(y)) print(next(y)) print(next(y)) print(next(y)) ----------结果如下---------- 1 2 3 Traceback (most recent call last): File /Users/Desktop/test.py, line 6, in module print(next(y)) StopIteration如何判断对象是否是迭代器和判断是否是可迭代对象的方法差不多只要把 Iterable 换成 Iterator。Python的for循环本质上就是通过不断调用next()函数实现的举个栗子下面的代码先将可迭代对象转化为Iterator再去迭代。这样可以节省对内存因为迭代器只有在我们调用 next() 才会实际计算下一个值。可迭代对象是迭代器、生成器和装饰器的基础。简单来说可以使用for来循环遍历的对象就是可迭代对象。比如常见的list、set和dict一、两个概念Iterable ≠ Iterator概念协议作用可迭代对象Iterable__iter__能被for遍历迭代器Iterator__iter____next__带状态逐个产出元素from collections.abc import Iterable, Iterator x [1, 2, 3] isinstance(x, Iterable) # True list 是可迭代对象 isinstance(x, Iterator) # False 但不是迭代器 y iter(x) # iter() 把 Iterable 转为 Iterator isinstance(y, Iterator) # True补充有__getitem__且接受整数索引的对象即使没有__iter__也能被iter()使用旧协议向后兼容。二、迭代器的工作机制迭代器是带状态的对象记录当前迭代位置。__iter__返回自身__next__返回下一个值无元素时抛出StopIterationx [1, 2, 3] y iter(x) print(next(y)) # 1 print(next(y)) # 2 print(next(y)) # 3 print(next(y)) # StopIteration三、for 循环的本质Python 的for循环等价于以下代码# for elem in x: 等价于 ↓ _iter iter(x) while True: try: elem next(_iter) # 循环体 except StopIteration: break先调用iter()转为迭代器再不断next()捕获StopIteration退出。迭代器惰性求值——只有调用next()才计算下一个值节省内存。四、生成器与迭代器的关系生成器Generator是创建迭代器的便捷方式自动实现迭代器协议# 生成器函数用 yield def counter(start0): while True: yield start start 1 # 生成器表达式 squares (x**2 for x in range(10))生成器本身就是迭代器无需手写__iter__/__next__。五、itertools 实用工具from itertools import count, cycle, chain, islice # count: 无限计数器 c count(start13) next(c) # 13 next(c) # 14 # chain: 拼接多个可迭代对象 list(chain([1, 2], [3, 4])) # [1, 2, 3, 4] # islice: 切片用于无限迭代器 list(islice(count(1), 5)) # [1, 2, 3, 4, 5]一句话记忆Iterable 是能被遍历的Iterator 是带状态逐个产出的。iter()把前者变成后者for循环 iter()while next()StopIteration。生成器是创建迭代器的语法糖。. Python 中生成器的相关知识结论生成器是惰性求值的迭代器用yield暂停执行并产出值。现代协程已不再依赖 generator而是async/await核心价值不必一次性生成所有数据按需计算节省内存。# 列表推导式定义即生成占满内存 a [x * x for x in range(10)] # 生成器表达式惰性求值几乎不占内存 b (x * x for x in range(10))生成器函数用yield代替return遇到yield暂停并返回值下次next()从断点恢复def spam(): yield first yield second yield third for x in spam(): print(x) # first / second / third调用函数不执行函数体而是返回生成器对象。yield记录执行位置下次从断点继续。send()— 双向通信生成器不仅能产出值还能接收外部传入的值def echo(): while True: received yield # 接收 send() 传入的值 print(fgot: {received}) gen echo() next(gen) # 先启动到 yield 处暂停必须 gen.send(hello) # got: hello gen.send(world) # got: worldyield from— 委托生成器PEP 380def sub_gen(): yield 1 yield 2 def main_gen(): yield 0 yield from sub_gen() # 直接委托给子生成器 yield 3 list(main_gen()) # [0, 1, 2, 3]yield from建立主生成器与子生成器的双向通道是async/await的前身。协程的现代演进⚠️阶段机制状态早期generator yield已废弃PEP 380yield from仍可用于生成器委托PEP 492async/await✅ 当前标准# 现代协程写法 import asyncio async def fetch_data(): await asyncio.sleep(1) return data❌ 协程通过 generator 实现是过时说法。现代协程用async/awaitasyncio.coroutine装饰器已在 3.12 移除。. Python 中装饰器的相关知识结论装饰器本质是接收函数、返回函数的高阶函数用语法糖实现隐式包装。必须加functools.wraps保留元信息 从手动包装到语法糖的演进import logging from functools import wraps def use_log(func): wraps(func) # ✅ 保留原函数 __name__、__doc__ 等元信息 def wrapper(*args, **kwargs): logging.warning(%s is running % func.__name__) return func(*args, **kwargs) return wrapper use_log # 等价于 bar use_log(bar) def bar(): I am bar print(I am bar) bar() # WARNING:root:bar is running # I am bar bar.__name__ # bar不加 wraps 会变成 wrapper带参数的装饰器— 三层嵌套def repeat(times): # 第 1 层接收参数 def decorator(func): # 第 2 层接收被装饰函数 wraps(func) def wrapper(*args, **kwargs): for _ in range(times): result func(*args, **kwargs) return result return wrapper return decorator repeat(3) # 先调用 repeat(3) 返回 decorator再用 decorator 装饰 def greet(): print(hi) greet() # 打印 3 次 hi类装饰器— 装饰器不一定是函数也可以是类class CountCalls: def __init__(self, func): self.func func self.count 0 def __call__(self, *args, **kwargs): self.count 1 print(fcall #{self.count}) return self.func(*args, **kwargs) CountCalls def say_hi(): print(hi)多个装饰器的执行顺序decorator_a # 先装饰外层 decorator_b # 后装饰内层 def func(): pass # 等价于func decorator_a(decorator_b(func)) # 执行时a 先进入b 后进入b 先退出a 后退出洋葱模型常见应用场景日志记录、性能计时、权限校验、缓存functools.lru_cache、重试机制。一句话记忆生成器用yield做惰性求值协程已转向async/await装饰器必须加wraps记住接收函数返回函数这一个本质带参装饰器只是多套一层。

相关新闻

路径规划——地图

路径规划——地图

我们在做全局路径规划的时候会用到两种地图,一种是栅格地图,另一种是高精地图。二者并不是简单的低精度地图与高精度地图之分,而是面向不同规划问题的两种环境表达方式。 栅格地图将空间离散为规则单元,用于描述障碍物占据状态、可…

2026/10/7 8:33:14 阅读更多 →
售后追踪系统能不能和扫码营销一起做?

售后追踪系统能不能和扫码营销一起做?

关键词: 售后追踪系统、扫码营销、一物一码、电子保修卡、工单管理、红包营销 太长不看版 可以一起做。 重点不是把所有功能都塞进一个页面,而是用同一套底层码体系,把验真、登记、营销、报修、工单回流串起来。 对中小品牌试点来说&#xf…

2026/10/13 23:59:23 阅读更多 →
虚拟机中Windows Server 2022本地管理员密码重置:原理、工具与实战避坑指南

虚拟机中Windows Server 2022本地管理员密码重置:原理、工具与实战避坑指南

1. 引言:当服务器“铁门”在你面前关上 想象一下这个场景:你负责维护的一台关键业务虚拟机,系统是 Windows Server 2022,它静静地躺在 VMware 或 Hyper-V 的某个角落里。某天,因为人员变动、策略调整,或者仅…

2026/10/14 18:56:30 阅读更多 →

最新新闻

云开发+短信API:零成本搭建员工生日自动提醒系统

云开发+短信API:零成本搭建员工生日自动提醒系统

每年一到员工生日这种日子,行政和HR就开始手忙脚乱。翻Excel、找手机号、挨个发祝福语,还要赶在当天发出,稍微一忙就会漏掉一两个。之前我们团队就是这么干的,直到有一次连续漏了三个同事的生日,被吐槽“公司没有人情味…

2026/10/15 20:02:24 阅读更多 →
Arcpy批量导出地图脚本:从手动出图到自动化流水线

Arcpy批量导出地图脚本:从手动出图到自动化流水线

1. 从手动一张张出图到批量流水线:这个脚本到底解决什么问题如果你做过GIS制图,大概率经历过这样的场景:手头有一份行政区划图层,领导要求按每个乡镇出一张专题图,一共几十上百个。打开ArcMap或ArcGIS Pro,…

2026/10/15 20:02:24 阅读更多 →
离散数学笔记高效整理法:五大板块与复习避坑指南

离散数学笔记高效整理法:五大板块与复习避坑指南

简介:这是一份系统梳理离散数学核心知识点的PDF笔记,围绕数理逻辑、集合论、数论、计数原理、概率论、关系论、代数系统与图论八大板块展开,适合高校本科生、考研复习者及程序员巩固理论基础。笔记从命题逻辑的永真式与范式讲起,依…

2026/10/15 20:02:24 阅读更多 →
python代码学习1

python代码学习1

摘要:f的用法、print中可用的操作、for、列表、ASCII编码一、f的用法:在输出里调整格式1.直接嵌入变量/表达式a 18 print(f"今年{a}岁") # 今年18岁2.保留有效数字pi 3.1415926 print(f"{pi:.2f}") # 3.14 print(f"{pi…

2026/10/15 20:02:24 阅读更多 →
IIS 6.0离线安装包:含全部DLL与注册表修复的SP2兼容部署方案

IIS 6.0离线安装包:含全部DLL与注册表修复的SP2兼容部署方案

简介:本资源为IIS 6.0完整安装支持包,面向Windows Server 2003系统管理员、传统Web运维人员及遗留系统维护开发者,专为解决IIS 6.0原生安装因缺失关键DLL导致失败或功能异常的典型问题。压缩包内含263个文件,涵盖19个核心DLL&…

2026/10/15 20:02:24 阅读更多 →
VMware复制粘贴失效?从VMware Tools到客户机隔离全排查指南

VMware复制粘贴失效?从VMware Tools到客户机隔离全排查指南

你是不是也遇到过这样的场景:虚拟机里装好了系统,想在宿主机和虚拟机之间复制一段代码、一个下载链接、一小段配置,结果CtrlC、CtrlV按了半天一点反应都没有;换成拖放文件,鼠标倒是能移过去,文件却死活拖不…

2026/10/15 20:01:22 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →