十六、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、铺垫
x = 'hello'
# print(dir(x))
iter_test = x.__iter__()
print(iter_test)
print(iter_test.__next__())
print(iter_test.__next__())
print(iter_test.__next__())
print(iter_test.__next__())
print(iter_test.__next__())
li = [1,2,3,4]
iter_li = li.__iter__() #遵行可迭代协议,故生成了可迭代对象
print(iter_li.__next__())
print(iter_li.__next__())
7、l针对 list 应用 ,以及for 循环和 while循环的对比
li = [1,2,3,4]
for i in li: # 因为li具有__iter__()属性,所以它具有了__next__()的属性,可以进行迭代
print(i) #for 循环具有普遍适用性 index = 0
while index < len(li): # 这种方法只适用于列表、字符串、元素,这些具有可迭代属性的类型,超出了这些,这种办法就不能用了
print(li[index])
index+=1
1
2
3
4
1
2
3
4
8、针对 set 应用
se = {1,2,3,4,5,6}
for i in se:
print(i)
se_iter = se.__iter__()
print(se_iter.__next__())
print(se_iter.__next__())
print(se_iter.__next__())
1
2
3
4
5
6
1
2
3
9、针对 dict 应用
di = {'a':1,'b':2,'c':3,'d':4}
iter_di = di.__iter__()
print(iter_di.__next__())
print(iter_di.__next__())
print(iter_di.__next__())
a
b
c
10、用迭代 打开文件
f = open('test.txt','r+',encoding='utf-8')
iter_f = f.__iter__()
print(iter_f)
print(iter_f.__next__(),end='')
print(iter_f.__next__(),end='')
print(iter_f.__next__(),end='
<_io.TextIOWrapper name='test.txt' mode='r+' encoding='utf-8'>
12344556
abcdef
ABCDEFG
11、异常操作:try 和 except
li = [1,2,3,4,5]
diedai_li = li.__iter__() while True:
try:
print(diedai_li.__next__())
except StopIteration:
print('迭代完成,循环已终止')
break
1
2
3
4
5
迭代完成,循环已终止
12、迭代器走向:(只能往后走,不能往前走)。
ll = ['爷爷','爸爸','儿子','孙子','重孙']
iter_ll = iter(ll) # ll.__iter__() 等价于 iter(ll)
print(iter_ll.__next__())
print(next(iter_ll))
print(iter_ll.__next__())
print(next(iter_ll))
爷爷
爸爸
儿子
孙子
二、为什么要有for循环?
基于上面列表的三种访问方式,我们可以知道,它们是通过下标的方式遍历来访问,序列类型字符串、列表、元组、都有下表,这些都可以用下标访问。但是,非序列类型象字典、集合、文件等,都是没有下标的,而for循环就是基于迭代器协议提供了一个同意的可以遍历所有对象的方法,即遍历前,先调用对象的__iter__()方法,
将其转换成一个迭代器,然后哦使用迭代器协议去实现循环访问,这样所有的对象就都可以通过for 循环嘞遍历了。而且我们看到的效果也是这样的。
十六、python沉淀之路--迭代器的更多相关文章
- 十、python沉淀之路--高阶函数初识
一.高阶函数:分两种:一种是返回值中包含函数体:另一种是把一个函数体当作了参数传给了另一个函数 1.返回值中包含函数体 例1. def test(): print('这是一个测试') return t ...
- 二十六. Python基础(26)--类的内置特殊属性和方法
二十六. Python基础(26)--类的内置特殊属性和方法 ● 知识框架 ● 类的内置方法/魔法方法案例1: 单例设计模式 # 类的魔法方法 # 案例1: 单例设计模式 class Teacher: ...
- 十六. Python基础(16)--内置函数-2
十六. Python基础(16)--内置函数-2 1 ● 内置函数format() Convert a value to a "formatted" representation. ...
- python3.4学习笔记(二十六) Python 输出json到文件,让json.dumps输出中文 实例代码
python3.4学习笔记(二十六) Python 输出json到文件,让json.dumps输出中文 实例代码 python的json.dumps方法默认会输出成这种格式"\u535a\u ...
- 十八、python沉淀之路--生成器
一.生成器 生成器总结:语法上和函数类似:生成器函数和常规函数几乎是一样的.他们都是使用def语句进行定义,差别在于生成器使用yield语句返回一个值,而常规函数使用return语句返回一个值.自动实 ...
- 十五、python沉淀之路--eval()的用法
一.eval函数 python eval() 函数的功能:将字符串str当成有效的表达式来求值并返回计算结果. 语法:eval(source[, globals[, locals]]) -> v ...
- 六、python沉淀之路--int str list tuple dict 重点总结
一.数字int(..)二.字符串replace/find/join/strip/startswith/split/upper/lower/formattempalte = "i am {na ...
- 十九、python沉淀之路--装饰器
一.实现装饰器的预备知识 装饰器 = 高阶函数 + 函数嵌套 + 闭包 1.高价函数定义: 1.函数接收的参数是一个函数名 2.函数的返回值是一个函数名 3.满足上述条件任意一个,都可称之 ...
- 十四、python沉淀之路--文件操作
一.文件操作b模式 1. # f = open('test11.py','rb',encoding='utf-8') # 这种情况会报错 f = open('test11.py','rb') # b ...
随机推荐
- PHP-FPM 慢执行日志、网站隔离配置
慢执行日志 1.配置文件下打开慢执行日志 vim /usr/local/php/etc/php-fpm.conf # 慢执行日志路径 slowlog = /path/to/slow.log # 设置超 ...
- filter方法解析
filter一般用于将数组中的某些元素过滤掉,并生成一个新的数组 基本语法如下: var newArray= arrayObj.filter(functionObj); newArray 根据过滤条件 ...
- shell脚本 入门 —— 符号篇
shell Shell就是一个命令行解释器,它的作用是解释执行用户的命令,用户输入一条命令,Shell就解释执行一条,这种方式称为交互式(Interactive). Shell还有一种执行命令的方式称 ...
- 20145219 《Java程序设计》第06周学习总结
20145219 <Java程序设计>第06周学习总结 教材学习内容总结 InputStream与OutputStream 串流设计 1.串流:Java将输入/输出抽象化为串流,数据有来源 ...
- 20162305 实验二 Java面向对象程序设计 实验报告
20162305 实验二 Java面向对象程序设计 实验报告 实验内容 1.初步掌握单元测试和TDD 2.理解并掌握面向对象三要素:封装.继承.多态 3.初步掌握UML建模 4.熟悉S.O.L.I.D ...
- 非法字符: '\ufeff' 解决方案|错误: 需要class, interface或enum
解决方案,把文件用Editplus打开,UTF-8+BOM编码的文件转为普通的UTF-8文件
- COS-5资源分配与调度
操作系统是用户和计算机的接口,同时也是计算机硬件和其他软件的接口.操作系统的功能包括管理计算机系统的硬件.软件及数据资源,控制程序运行,改善人机界面,为其它应用软件提供支持,让计算机系统所有资源最大限 ...
- Eclipse 添加JSP模板
0.环境 Eclipse IDE for Java EE Developers (4.3.2) win8.1系统 1.原因 Eclipse自带新建JSP为: <%@ page language= ...
- Centos6.5 安装gitlab 并使用自带的nginx
Centos6.5 安装gitlab 并使用自带的nginx 1.安装依赖 yum -y install policycoreutils openssh-server openssh-clients ...
- Dagger2 中的 Scope
Dagger2 中虽然概念挺多的,但是大部分花时间都能理清.包括看人家的分析,Debug 代码下去也能懂.但是对于 scope 的用法以及实现原理还是有点难理解的.主要的问题也像简书上的文章所说: 自 ...