十六、python沉淀之路--迭代器
一、迭代器
1、什么是迭代器协议:对象必须提供一个next方法,执行该方法要返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代(只能往后走,不能往前走)。
2、可迭代对象:实现了迭代协议的对象,(如何实现:对象内部定义了一个__iter__()方法)。
3、协议是一种约定,可迭代对象实现迭代器协议,python的内部工具(如for循环,sum,min,max函数等)使用迭代器协议访问对象。
4、python种强大的for循环机制:
for循环的本质:循环所有对象,全部是使用迭代器协议。
正本溯源:
很多人会想,for循环的本质就是遵循迭代器协议去访问对象,那么for循环的对象肯定都是迭代器了啊,没错,那既然这样,for循环可以遍历(字符串、列表、元组、字典、集合、文件对象),那这些类型的数据肯定都是可以迭代对象的?但是,为什么定义一个列表 li = [1,2,3,4,5]没有next()的方法呢。
(字符串,列表,元组,字典,集合,文件对象)这些都不是可迭代对象,只不过在for循环时,调用他们内部的__iter__()方法,把他们变成了可迭代对象。然后for循环调用迭代对象的__next__()方法取值,而且for循环会捕捉StopIteration异常,以终止迭代。
5、for循环访问方式:
for循环本质就是遵循了迭代器协议的访问方式,先调用iter_li = li.__iter__()方法,或者直接iter_li=iter(li),然后依次执行iter_li.next(),直到for循环捕捉到stopiteration 终止循环。for循环所有对象的本质都是一样的原理。
6、铺垫
1 x = 'hello' 2 # print(dir(x)) 3 iter_test = x.__iter__() 4 print(iter_test) 5 print(iter_test.__next__()) 6 print(iter_test.__next__()) 7 print(iter_test.__next__()) 8 print(iter_test.__next__()) 9 print(iter_test.__next__())
1 li = [1,2,3,4] 2 iter_li = li.__iter__() #遵行可迭代协议,故生成了可迭代对象 3 print(iter_li.__next__()) 4 print(iter_li.__next__())
7、l针对 list 应用 ,以及for 循环和 while循环的对比
1 li = [1,2,3,4] 2 for i in li: # 因为li具有__iter__()属性,所以它具有了__next__()的属性,可以进行迭代 3 print(i) #for 循环具有普遍适用性 4 5 index = 0 6 while index < len(li): # 这种方法只适用于列表、字符串、元素,这些具有可迭代属性的类型,超出了这些,这种办法就不能用了 7 print(li[index]) 8 index+=1
1 1 2 2 3 3 4 4 5 1 6 2 7 3 8 4
8、针对 set 应用
1 se = {1,2,3,4,5,6} 2 for i in se: 3 print(i) 4 se_iter = se.__iter__() 5 print(se_iter.__next__()) 6 print(se_iter.__next__()) 7 print(se_iter.__next__())
1 1 2 2 3 3 4 4 5 5 6 6 7 1 8 2 9 3
9、针对 dict 应用
1 di = {'a':1,'b':2,'c':3,'d':4} 2 iter_di = di.__iter__() 3 print(iter_di.__next__()) 4 print(iter_di.__next__()) 5 print(iter_di.__next__())
1 a 2 b 3 c
10、用迭代 打开文件
1 f = open('test.txt','r+',encoding='utf-8') 2 iter_f = f.__iter__() 3 print(iter_f) 4 print(iter_f.__next__(),end='') 5 print(iter_f.__next__(),end='') 6 print(iter_f.__next__(),end='
1 <_io.TextIOWrapper name='test.txt' mode='r+' encoding='utf-8'> 2 12344556 3 abcdef 4 ABCDEFG
11、异常操作:try 和 except
1 li = [1,2,3,4,5] 2 diedai_li = li.__iter__() 3 4 while True: 5 try: 6 print(diedai_li.__next__()) 7 except StopIteration: 8 print('迭代完成,循环已终止') 9 break
1 1 2 2 3 3 4 4 5 5 6 迭代完成,循环已终止
12、迭代器走向:(只能往后走,不能往前走)。
1 ll = ['爷爷','爸爸','儿子','孙子','重孙'] 2 iter_ll = iter(ll) # ll.__iter__() 等价于 iter(ll) 3 print(iter_ll.__next__()) 4 print(next(iter_ll)) 5 print(iter_ll.__next__()) 6 print(next(iter_ll))
1 爷爷 2 爸爸 3 儿子 4 孙子
二、为什么要有for循环?
基于上面列表的三种访问方式,我们可以知道,它们是通过下标的方式遍历来访问,序列类型字符串、列表、元组、都有下表,这些都可以用下标访问。但是,非序列类型象字典、集合、文件等,都是没有下标的,而for循环就是基于迭代器协议提供了一个同意的可以遍历所有对象的方法,即遍历前,先调用对象的__iter__()方法,
将其转换成一个迭代器,然后哦使用迭代器协议去实现循环访问,这样所有的对象就都可以通过for 循环嘞遍历了。而且我们看到的效果也是这样的。
转载于:https://www.cnblogs.com/jianguo221/p/8976791.html
十六、python沉淀之路--迭代器相关推荐
- 二十六. Python基础(26)--类的内置特殊属性和方法
二十六. Python基础(26)--类的内置特殊属性和方法 ● 知识框架 ● 类的内置方法/魔法方法案例1: 单例设计模式 # 类的魔法方法 # 案例1: 单例设计模式 class Teacher: ...
- 南宁市第二十六中学:教研路漫漫,花香伴我行
应横州市教育局的邀请,我校英语教研团队六名教师,于2022年9月19日至9月21日作为特邀专家参加了2022年横州市中小学教师"育秀工程"培训.为给横州市师生呈现真实有效的课堂以及 ...
- [网络安全自学篇] 十六.Python攻防之弱口令、自定义字典生成及网站防护
这是作者的系列网络安全自学教程,主要是关于网安工具和实践操作的在线笔记,特分享出来与博友共勉,希望您们喜欢,一起进步.前文分享了Python网络攻防基础知识.Python多线程.C段扫描和数据库编程, ...
- python学习笔记(十六)-Python多线程多进程
一.线程&进程 对于操作系统来说,一个任务就是一个进程(Process),比如打开一个浏览器就是启动一个浏览器进程,打开一个记事本就启动了一个记事本进程,打开两个记事本就启动了两个记事本进程, ...
- 三、python沉淀之路--列表(list)
一.列表提供的一些方法 1.append():在原值最后追加 1 li = [11,22,33,44,55,] 2 li.append(99) 3 print(li) 4 li.append('中国' ...
- 四、python沉淀之路--元组
一.元组基本属性 1.元组不能被修改,不能被增加.不能被删除 2.两个属性 tu.count(22) #获取指定元素在元组中出现的次数 tu.index(22) #获取指定元素的 ...
- 跨平台应用开发进阶(二十六) :忐忑悲壮路,心酸出坑史——记第一次iOS艰辛上架路
文章目录 一.前言 二.上架问题汇总 2.1 Guideline 5.1.1 - Legal - Privacy - Data Collection and Storage We noticed th ...
- Python之路【第十六篇】:Django【基础篇】
https://www.cnblogs.com/wupeiqi/articles/5237704.html Python之路[第十六篇]:Django[基础篇] Python的WEB框架有Django ...
- 第十六篇 Python之迭代器与生成器
一.迭代器 一. 递归和迭代 生活实例说明什么是递归和迭代 A想去腾达大厦,问B怎么走路,B 说我不知道,我给你问问C,C也不知道,C又去问D,D知道,把路告诉了C,C又告诉B,B最后告诉A, 这就是 ...
最新文章
- Angular:Promise.all()的具体应用
- 2018年安卓绿色联盟数据报告
- centos6.5配置Hadoop环境,运行wordcount例子
- sync.Once简介
- “集百度AI技术之大成的终极硬件形态”发布
- u检验中的查u界值表_延边双壁波纹管pvc-u
- 利用C++不使用递归,循环和goto,打印1到100 的某一答案分析
- InfoGAN(Interpretable representation learning by information maximizing GAN)
- 【示波器专题】示波器探头的原理和分类
- 华为笔试:拼音与英文互相转换python
- Vue的diff算法原理是什么?
- 阿里云服务器---修改下载源---阿里云镜像---yum--CentOS
- 十年饮冰鸿蒙将至,咕哒:十年饮冰难凉热血 十年头牌阿联可称忠烈
- Win10 系统设置共享文件
- 单词翻转字母顺序c语言,单词翻转(C语言实现)
- 奥扬科技IPO被终止注册:年营收8亿 苏伟持有67.5%股权
- 西部学刊杂志西部学刊杂志社西部学刊编辑部2022年第14期目录
- 移动CRM产品同质化严重,市场一片红海
- WPF使用转换器(Converter)
- 多自由度有阻尼matlab,多自由度阻尼系统固有振型的MATLAB求解程序
热门文章
- 从零点五开始用Unity做半个2D战棋小游戏(六)
- 动人配乐是如何炼成的?带您了解《花之灵》背景原声的幕后制作秘辛
- 程序员数学基础【四、取模应用-判断奇偶数、判断素数、求两个数的最大公约数、水仙花数】(Python版本)
- 使用Oracle的审计功能监控数据库中的可疑操作
- C++的一些知识点摘抄(创建基本类 高级类)
- Vue.js 笔记之 img src
- LeetCode 13. Roman to Integer
- java 保护内存操作的方法
- 关于 Python generator(生成器)的类比
- loadrunner 分用户日志