没有合适的资源?快使用搜索试试~ 我知道了~
文章目录Python 入门基础进阶迭代器&生成器前引python中for循环的机制迭代器和可迭代协议可迭代协议迭代器协议方法1方法2方法3为什么要使用for循环生成器Python中提供的生成器:生成器Generator:生成器函数生成器的优点:yield关键字:send方法:yield from方法列表推导式和生成器表达式推导式的套路列表推导式字典推导式集合推导式**装饰器**装饰器初识概念装饰器的形成过程装饰器推导过程第一步:把函数当做参数传入第二步:利用闭包函数,解决重复运行问题第三步:提炼赋值表达式,定义语法糖语法糖@:给装饰器加上参数功能思路练习装饰器开放封闭原则装饰器的主要功能和固定
资源推荐
资源详情
资源评论
小白小白IT:Python 入门基础进阶入门基础进阶(迭代器迭代器/生成器生成器/*装饰器装饰器)
文章目录文章目录Python 入门基础进阶迭代器&生成器前引python中for循环的机制迭代器和可迭代协议可迭代协议迭代器协议方法1方
法2方法3为什么要使用for循环生成器Python中提供的生成器:生成器Generator:生成器函数生成器的优点:yield关键字:
send方法:yield from方法列表推导式和生成器表达式推导式的套路列表推导式字典推导式集合推导式**装饰器**装饰器初识概
念装饰器的形成过程装饰器推导过程第一步:把函数当做参数传入第二步:利用闭包函数,解决重复运行问题第三步:提炼赋
值表达式,定义语法糖语法糖@:给装饰器加上参数功能思路练习装饰器开放封闭原则装饰器的主要功能和固定结构多个装饰
器装饰同一个函数多层装饰器嵌套问题
Python 入门基础进阶入门基础进阶
迭代器迭代器&生成器生成器
前引前引
假如我现在有一个列表l=[‘a’,‘b’,‘c’,‘d’,‘e’],我想取列表中的内容,有几种方式?
首先,我可以通过索引取值l[0],其次我们是不是还可以用for循环来取值呀?
你有没有仔细思考过,用索引取值和for循环取值是有着微妙区别的。
如果用索引取值,你可以取到任意位置的值,前提是你要知道这个值在什么位置。前提是你要知道这个值在什么位置。。
如果用如果用for循环来取值,我们把每一个值都取到,不需要关心每一个值的位置,因为只能顺序的取值,并不能跳过任何一个直接循环来取值,我们把每一个值都取到,不需要关心每一个值的位置,因为只能顺序的取值,并不能跳过任何一个直接
去取其他位置的值。去取其他位置的值。
但你有没有想过,我们为什么可以使用for循环来取值?
for循环内部是怎么工作的呢?
python中中for循环的机制循环的机制
首先,我们对一个列表进行for循环。
for i in [1,2,3,4]:
print(i)
上面的代码肯定没有问题,我们换一种情况试试,来循环数字1234.
for i in 1234
print(i)
结果:
Traceback (most recent call last):
File "test.py", line 4, in
for i in 1234:
TypeError: 'int' object is not iterable
看,报错了!报了什么错呢?“TypeError: ‘int’ object is not iterable”,说int类型不是一个iterable,那这个iterable是个啥?
迭代器和可迭代协议迭代器和可迭代协议
现在,我们已经获得了一个新线索,有一个叫做**“可迭代的”概念**。
首先,我们从报错来分析,好像之所以1234不可以for循环,是因为它不可迭代。那么如果“可迭代”,就应该可以被for循环了。
这个我们知道呀,字符串、列表、元组、字典、集合字符串、列表、元组、字典、集合都可以被for循环,说明他们都是可迭代的都是可迭代的。
我们怎么来证明这一点呢?
from collections import Iterable
l = [1,2,3,4] t = (1,2,3,4)
d = {1:2,3:4}
s = {1,2,3,4}
print(isinstance(l,Iterable)) #判断 l 数据类型是否可迭代
print(isinstance(t,Iterable))
print(isinstance(d,Iterable))
print(isinstance(s,Iterable))
结合我们使用for循环取值的现象,再从字面上理解一下,其实迭代就是我们刚刚说的,可以将某个数据集内的数据“一个挨着
一个的取出来”,就叫做迭代叫做迭代。
可迭代协议可迭代协议
能被for循环的对象,就是可迭代对象,那我们怎么知道一个对象能不能被for循环呢?
其实某一个数据类型能被for循环,本质上是因为满足一个要求,这个要求就是可迭代协议
可迭代协议:对象内部实现了__iter__方法。
总结一下我们现在所知道的:可以被for循环的都是可迭代的,要想可迭代,内部必须有一个__iter__方法。
接着分析,__iter__方法做了什么事情呢?
print([1,2].__iter__())
结果
我们执行了列表[1,2]的__iter__方法,获得了一个list_iterator,我们得到了一个新的名词——iterator
这个就是计算机中的专属名词,叫迭代器。
迭代器协议迭代器协议
既什么叫“可迭代”之后,又一个历史新难题,什么叫“迭代器”?
虽然我们不知道什么叫迭代器,但是我们现在已经有一个迭代器了,这个迭代器是一个列表的迭代器。
我们来看看这个列表的迭代器比起列表来说实现了哪些新方法,这样就能揭开迭代器的神秘面纱了吧?
'''
dir([1,2].__iter__())是列表迭代器中实现的所有方法,dir([1,2])是列表中实现的所有方法,都是以列表的形式返回给我们的,为了看的更清楚,我们分别把他
们转换成集合,
然后取差集。
'''
#print(dir([1,2].__iter__()))
#print(dir([1,2]))
print(set(dir([1,2].__iter__()))-set(dir([1,2])))
结果:
{'__length_hint__', '__next__', '__setstate__'}
我们看到在列表迭代器中多了三个方法,那么这三个方法都分别做了什么事呢?
方法方法1
iter_l = [1,2,3,4,5,6].__iter__()
#获取迭代器中元素的长度
print(iter_l.__length_hint__())
#根据索引值指定从哪里开始迭代
print('*',iter_l.__setstate__(0))
#一个一个的取值
print('**',iter_l.__next__())
print('***',iter_l.__next__())
print('****',iter_l.__next__())
6
* None
** 1
*** 2
**** 3
这三个方法中,能让我们一个一个取值的就是next方法
在for循环中,就是在内部调用了一个__next__方法才能一个接一个取到值,
我们用next方法写一个不依赖for的遍历
方法方法2
l = [1,2,3,4] l_iter = l.__iter__()
item = l_iter.__next__()
print(item)
item = l_iter.__next__()
print(item)
item = l_iter.__next__()
print(item)
item = l_iter.__next__()
print(item)
item = l_iter.__next__()
print(item)
1
剩余11页未读,继续阅读
资源评论
weixin_38631389
- 粉丝: 6
- 资源: 891
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- (源码)基于Django和OpenCV的智能车视频处理系统.zip
- (源码)基于ESP8266的WebDAV服务器与3D打印机管理系统.zip
- (源码)基于Nio实现的Mycat 2.0数据库代理系统.zip
- (源码)基于Java的高校学生就业管理系统.zip
- (源码)基于Spring Boot框架的博客系统.zip
- (源码)基于Spring Boot框架的博客管理系统.zip
- (源码)基于ESP8266和Blynk的IR设备控制系统.zip
- (源码)基于Java和JSP的校园论坛系统.zip
- (源码)基于ROS Kinetic框架的AGV激光雷达导航与SLAM系统.zip
- (源码)基于PythonDjango框架的资产管理系统.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功