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/8/7 7:56:34 阅读更多 →
售后追踪系统能不能和扫码营销一起做?

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

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

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

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

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

2026/8/7 7:55:33 阅读更多 →

最新新闻

Java 数组操作

Java 数组操作

1. 数组遍历 操作数组时,最常见的操作就是遍历。通过 for 循环即可遍历数组——因为数组的每个元素都可以通过索引来访问,因此使用标准的 for 循环就能完成遍历: public class Main {public static void main(String[] args) {int[] ns {1…

2026/8/7 8:45:56 阅读更多 →
前端无剪辑拆卡实战:用代码还原设计稿,告别手动切图

前端无剪辑拆卡实战:用代码还原设计稿,告别手动切图

最近在整理项目时,发现很多开发者对如何高效、规范地管理项目中的“卡片”式组件(比如用户卡片、商品卡片、信息展示卡片)感到头疼。从设计稿到最终页面,往往需要经历手动计算尺寸、拼接图片、处理响应式等一系列繁琐步骤&#xf…

2026/8/7 8:45:56 阅读更多 →
ZBrush细节优化与拓扑重构实战技巧

ZBrush细节优化与拓扑重构实战技巧

1. ZBrush细节优化核心思路解析 在数字雕刻领域,ZBrush早已成为行业标杆工具,但真正决定作品质量的往往是细节处理阶段。从业十年间,我见过太多作品在基础造型阶段表现优异,却在最后30%的细节优化环节功亏一篑。究其原因&#xff…

2026/8/7 8:45:56 阅读更多 →
深度学习分类任务核心:Softmax函数原理、PyTorch实现与实战指南

深度学习分类任务核心:Softmax函数原理、PyTorch实现与实战指南

1. 从困惑到清晰:为什么我们需要Softmax? 如果你刚开始接触深度学习,尤其是分类任务,那么“Softmax”这个名字你一定不陌生,也一定曾被它困扰过。我第一次看到它时,心里也满是问号:为什么模型最…

2026/8/7 8:45:56 阅读更多 →
51单片机定时器中断驱动蜂鸣器播放《il vento d‘oro》音乐项目详解

51单片机定时器中断驱动蜂鸣器播放《il vento d‘oro》音乐项目详解

这次我们来看一个非常有趣的嵌入式音乐项目:用经典的51单片机来演奏《黄金之风》的处刑曲《il vento doro》。这个项目完美结合了硬件编程、音乐乐理和流行文化,展示了即使是最基础的8位MCU,也能通过精准的定时器控制,还原出极具辨…

2026/8/7 8:45:56 阅读更多 →
Qt模拟鼠标点击:应用层与系统层实现详解与实战

Qt模拟鼠标点击:应用层与系统层实现详解与实战

1. 项目概述:为什么我们需要模拟鼠标点击? 在桌面应用开发中,尤其是基于Qt框架进行自动化测试、远程协助、宏操作或者辅助工具开发时,模拟鼠标点击是一个高频且核心的需求。想象一下,你需要开发一个自动化脚本&#xf…

2026/8/7 8:44:56 阅读更多 →

日新闻

为什么scrcpy成为Android投屏的终极解决方案:完整实战指南

为什么scrcpy成为Android投屏的终极解决方案:完整实战指南

为什么scrcpy成为Android投屏的终极解决方案:完整实战指南 【免费下载链接】scrcpy Display and control your Android device 项目地址: https://gitcode.com/GitHub_Trending/sc/scrcpy 想要将Android手机屏幕完美投射到电脑上,享受大屏操作的自…

2026/8/7 0:00:19 阅读更多 →
如何在5分钟内掌握Tom Select:打造现代化表单选择器的终极指南

如何在5分钟内掌握Tom Select:打造现代化表单选择器的终极指南

如何在5分钟内掌握Tom Select:打造现代化表单选择器的终极指南 【免费下载链接】tom-select Tom Select is a lightweight (~16kb gzipped) hybrid of a textbox and select box. Forked from selectize.js to provide a framework agnostic autocomplete widget wi…

2026/8/7 0:00:19 阅读更多 →
5分钟快速上手:NSZ压缩工具终极指南,轻松管理Switch游戏文件

5分钟快速上手:NSZ压缩工具终极指南,轻松管理Switch游戏文件

5分钟快速上手:NSZ压缩工具终极指南,轻松管理Switch游戏文件 【免费下载链接】nsz NSZ - Homebrew compatible NSP/XCI compressor/decompressor 项目地址: https://gitcode.com/gh_mirrors/ns/nsz 你是否在为Nintendo Switch游戏文件占用大量存储…

2026/8/7 0:00:19 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/6 22:02:27 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/6 22:02:27 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/6 22:02:27 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/5 23:28:39 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/6 22:02:28 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/5 23:46:51 阅读更多 →