Python小白学习之路(二十一)—【迭代器】
迭代器
1.迭代器协议
对象必须提供一个 next 方法,执行该方法要么返回迭代中的下一项,要么就引起一个Stoplteration异常,以终止迭代(只能往后走不能往前退)
2.可迭代对象
实现了迭代器协议的对象(如何实现:对象内部定义一个_iter_()方法)
协议是一种约定,可迭代对象实现了迭代器协议,python的内部工具(如 for循环,sum,min,max函数等)使用迭代器协议访问对象
3.关于for循环机制
for循环的本质:循环所有对象,全都是使用迭代器协议
思考:for 循环的本质是遵循迭代器协议去访问对象,那么for循环的对象肯定都是迭代器。那么既然这样,for循环可以遍历(字符串、列表、元祖、字典、集合、
文件对象),那么这些类型的数据肯定都是可迭代对象。但是我们发现,定义了一个字符串 S = ‘xhg’,却发现S.next()方法,违背了迭代器协议。所以不是
迭代对象。
从不同角度分析问题,得出了不同的结论。要想了解具体怎么回事,需要知道for循环内部做了些什么事情
结论:(字符串、列表、元祖、字典、集合、文件对象)这些都不是可迭代对象,只不过在for循环时,
调用了他们内部的 _iter_() 方法,把他们变成了可迭代对象,然后for循环调用可迭代对象的 _next_()
方法去取值,而且for循环会捕捉Stoplteration异常,以终止迭代
f = [1, 2, 3, 4, 5]
for i in f:
print(i)
#分析
第一步:iter_f = f.__iter__() #调用了他们内部的 _iter_() 方法,把他们变成了可迭代对象,遵循可迭代协议
第二步:iter_f.__next__() #调用可迭代对象 iter_f 的 __next__() 方法进行取值
#for循环内部等同于做了以下代码的作用: f = [1, 2, 3, 4, 5]
iter_f = f.__iter__()
print(iter_f)
print(iter_f.__next__())
print(iter_f.__next__())
print(iter_f.__next__())
print(iter_f.__next__())
print(iter_f.__next__())
iter_f.__next__() 等同于 next(iter_f)
4.实现列表取值的两种方法
方法一:索引 f = [1, 2, 3, 4, 5]
print(f[2])
方法二:利用迭代器思想 iter_f = f.__iter__()
print(iter_f.__next__())
print(iter_f.__next__())
5.遍历列表内部全部值的两种方法
方法一:利用 for 循环(基于迭代器协议)
f = [1, 2, 3, 4, 5]
for i in f:
print(i)
方法二:利用 while 循环 f = [1, 2, 3 ,4, 5]
index = 0
while index < len(f):
print(f[index])
index += 1
思考:并非所有类型的数据遍历都可以用while循环。序列类型字符串、列表、元祖都有下标
使用while循环,利用下标遍历,是可以的。但是对于非序列类型数据,如字典、集合、文件对象
的遍历,while 循环无法实现遍历。但是利用 for 循环可以。
因为for 循环就是基于迭代器协议提供了一个统一的可以遍历所有对象的方法。即在遍历前先调用对象的__iter__()方法,
将对象转换为一个迭代器,然后使用迭代器协议就可以实现循环访问。所以 for 循环较为强大。
举例:
#字典的循环:
dic = {'key1':1, 'key2':2}
for i in dic:
print(i) #执行结果
key1
key2 #for 循环作用:
dic = {'key1':1, 'key2':2}
iter_dic = dic.__iter__()
print(iter_dic.__next__())
print(iter_dic.__next__()) #注意:对于字典,默认遍历的是key值
#文件的循环:
f = open('日志文件', 'r+')
for i in f:
print(i,end='')
#执行结果
1111
2222
3333
4444
#注意:for循环每次遍历的是文件的一行内容 #for 循环作用:
f = open('日志文件', 'r+')
iter_f = f.__iter__()
print(iter_f.__next__(), end='')
print(iter_f.__next__(), end='')
print(iter_f.__next__(), end='')
print(iter_f.__next__(), end='')
写在后面:
最近好像有点烦躁
心情也不是很好 阶段性心情差
想打人!!!!
希望睡一觉起来会好一些吧
Python小白学习之路(二十一)—【迭代器】的更多相关文章
- Python小白学习之路(十一)—【局部变量和全局变量】【关键字global】【关键字nonlocal】
写在前面: 几乎有一周没有更新学习笔记了吧 上周一周身体都不怎么舒服 然后还得写开题报告 然后还得看文献 天天就是写写写写写写~~~~~~改改改改改改~~~~~~~~~ 今天又开始学习了 希望之前的没 ...
- Python小白学习之路(二)—【Pycharm安装与配置】【创建项目】【运算符】【数据类型】
写在前面: 第二天的学习,感觉比昨天学习相对轻松一些,但是对于我这个编程语言功底很弱的人来说,还是稍稍微有些.....哈尔滨的天气一天天冷了下来,还飘着小雨,不过还是挺有意境的.充实而又忙碌的生活,让 ...
- Python小白学习之路(二十二)—【生成器】
一.什么是生成器? 生成器可以理解成是一种数据类型,特殊地是生成器可以自动实现迭代器协议其他的数据类型需要调用自己内置的__iter__方法所以换种说法,生成器就是可迭代对象 !回忆:很重要的迭代器协 ...
- Python小白学习之路(二十)—【打开文件的模式二】【文件的其他操作】
打开文件的模式(二) 对于非文本文件,我们只能使用b模式,"b"表示以字节的方式操作(而所有文件也都是以字节的形式存储的,使用这种模式无需考虑文本文件的字符编码.图片文件的jgp格 ...
- Python小白学习之路(二十六)—【if __name__ =='__main__':】【用状态标识操作】
规则一: 一个python文件中,只写一些可以运行的功能测试代码写在这句代码下面 if __name__ =='__main__': 在讲这边的时候,我不是很懂参考了一篇博客,地址如下:http:// ...
- Python小白学习之路(二十四)—【装饰器】
装饰器 一.装饰器的本质 装饰器的本质就是函数,功能就是为其他函数添加附加功能. 利用装饰器给其他函数添加附加功能时的原则: 1.不能修改被修饰函数的源代码 2.不能修改被修饰函数的调用 ...
- Python小白学习之路(二十三)—【生成器补充】
生成器的一些补充 接着下鸡蛋和吃包子! 补充一:生成器只能遍历一次 (总是把生成器比喻成母鸡下鸡蛋,需要一个下一个,首先是下出来的鸡蛋不能塞回母鸡肚子里,其次是一个母鸡一生只能下一定数量的鸡蛋,下完了 ...
- Python小白学习之路(十七)—【内置函数二】
序列操作类函数 all() 功能:判断可迭代对象的每个元素是否都为True值注意:If the iterable is empty, return True.(举例3) 回顾:None '' ...
- Python小白学习之路(二十五)—【装饰器的应用】
通过一个任务来加深对装饰器的理解和应用 回顾:装饰器的框架 def timmer(func): def wrapper(): func() return wrapper 任务:给以下正在运行的程序加一 ...
随机推荐
- 百度词汇检索,计算PMI值
'''词汇检索百度返回值,并且计算PMI值的类''' from bs4 import BeautifulSoup import requests import re import pandas as ...
- 使用reactjs做一个CRUD功能
第一步:引入reactjs所依赖的js文件,本案例使用的是bootstrap前端框架,所以引入了相应的js和css文件 第二步:body里面添加两个div 第三步:开始编写reactjs脚本 < ...
- 2018.10.15 bzoj4445: [Scoi2015]小凸想跑步(半平面交)
传送门 话说去年的省选计算几何难度跟前几年比起来根本不能做啊(虽然去年考的时候并没有学过计算几何) 这题就是推个式子然后上半平面交就做完了. 什么? 怎么推式子? 先把题目的概率转换成求出可行区域. ...
- 2018.10.01 bzoj3237: [Ahoi2013]连通图(cdq分治+并查集)
传送门 cdq分治好题. 对于一条边,如果加上它刚好连通的话,那么删掉它会有两个大集合A,B.于是我们先将B中禁用的边连上,把A中禁用的边禁用,再递归处理A:然后把A中禁用的边连上,把B中禁用的边禁用 ...
- vi 基本使用命令
说明:以下的例子中 xxx 表示在命令模式下输入 xxx 并回车以下的例子中 :xxx 表示在扩展模式下输入 xxx 并回车小括号中的命令表示相关命令在编辑模式或可视模式下输入的命令会另外注明 1 查 ...
- css3美化滚动条样式
1.改变浏览器默认的滚动条样式 ::-webkit-scrollbar-track-piece { //滚动条凹槽的颜色,还可以设置边框属性 background-color:#f8f8f8; } : ...
- web大文件上传(web应用---SSH框架)
版权所有 2009-2018荆门泽优软件有限公司 保留所有权利 官方网站:http://www.ncmem.com/ 产品首页:http://www.ncmem.com/webapp/up6.2/in ...
- 洛谷P1600 天天爱跑步(线段树合并)
小c同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.<天天爱跑步>是一个养成类游戏,需要玩家每天按时上线,完成打卡任务. 这个游戏的地图可以看作一一棵包含 nn ...
- 深浅 buffer
var str = "深入浅出"; var buf = new Buffer(str, 'utf-8'); console.log(buf); 这种情况下是数字 var str = ...
- mysql的sql性能分析器
MySQL 的SQL性能分析器主要用途是显示SQL执行的整个过程中各项资源的使用情况.分析器可以更好的展示出不良SQL的性能问题所在. mysql sql profile的使用方法 1.开启mysql ...