迭代器、生成器、装饰器以及for循环的本质
一、可迭代对象
什么是可迭代对象:
在数据类型的后面可以使用点加 __ iter __ (.__ iter __)来判断是不是可迭代对象
不是可迭代对象:
int float bool 函数对象
可迭代对象:
str list dict tuple set 文件对象
二、 迭代器对象
迭代器介绍:
迭代器即用来迭代取值的工具,而迭代时重复反馈过程的活动,其目的通常是为了逼近所需的目标和结果,每一次对过程的重复称为一次 "迭代",而每一次迭代得到的结果会作为下一次迭代的初始值,单纯的重复并不是迭代
迭代器对象:
所有的可迭代对象在使用双下划线iter方法后都会变成迭代器对象,变成迭代器对象后继续使用__ iter __方法就没有效果了,但是可以执行。
判断迭代器对象的本质是查看内置方法中是否有__ iter __ 和 __ next __
迭代器对象的作用
优点:
1、提供了一种不依赖于索引取值的方式,正因为有迭代器的存在 我们的字典 集合才可以被 for 循环
2、惰性计算:迭代器对象表示的是一个数据流,可以只在需要时才去调用__ next __来计算出一个值,就迭代器本身来说,同一时刻在内存中只有一个值,因而可以存放无限大的数据流,而对其他容器类型,如列表,需要把所有的元素都放在内存中,受内存大小的限制,可以存放的值的个数是有限的。
缺点:
1、除非取尽,否则无法获取迭代器的长度
2、只能取下一个值,不能回到开始,更像是'一次性的',迭代器产生后的唯一目标就是重复执行next方法直到值取尽,否则就会停留在某个位置,等待下一次调用next; 若是要再次迭代同个对象,你只能重新调用iter方法去创建一个新的迭代器对象,如果有两个或者多个循环使用同一个迭代器,必然只有会一个循环能取到值
迭代器对象实操:
s1 = 'hello' # 可迭代对象 res = s1.__iter__() # 迭代器对象 print(res.__next__()) # 迭代取值 for循环的本质
这里需要注意,如果__next__取不到值就会报错。
注意事项
1、可迭代对象调用__ iter __会称为迭代器对象
2、迭代器对象如果还调用__ iter __不会有任何变化 还是迭代器对象本身
3、由于 __ iter __ __ next __写起来复杂,所以使用中会出现iter()和next()这两种形式
三、for循环的本质
for循环的结构:
for 变量名 in 可迭代对象:
循环体代码
现在我们可以知道for循环只是把字典、集合这类数据进行了__ iter __ 和 __next __操作进行一次次取值,流程如下:
- 先将in 后面的数据用 __ iter __转变成迭代器对象
- 一次让迭代器对象调用 __ next __ 取值
- 一旦 __ next __ 取不到值报错 for循环会自动捕获并处理
四、装饰器
1.什么是装饰器
在 Python 中,装饰器(Decorator)是一种特殊的语法,用于修改函数或类的行为。装饰器可以在不修改原始函数或者类的代码的情况下,向其添加新的功能或修改其行为。
装饰器本质上是闭包函数,它接受一个函数或类作为参数,并返回一个新的函数或类。
装饰器可以用于很多方面,例如:
在函数执行前后添加日志或者计时器 缓存函数的结果,以避免重复计算 检查函数参数的类型和值是否符合预期 为函数添加重试、重载或异常处理机制 修改类的行为,例如添加属性或方法
装饰器是Python语言中一个强大特性,它可以使代码更简介,可读性更好、可维护性更强、并且可以在不修改源代码的情况下实现额外的功能
2.装饰器的本质
装饰器的本质是闭包函数。装饰器是一个函数,它接受一个函数作为参数,并返回一个函数。==当装饰器被应用到一个函数时,它实际时将该函数作为参数传递给装饰器函数,并用装饰器函数返回新的函数替换原函数。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构