十六、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面向对象程序设计之接口(interface)
接口(interface)是抽象方法和静态常量定义的集合.接口是一种特殊的抽象类,这种抽象类中只包含抽象方法和静态常量. 为什么说接口是一种特殊的抽象类呢?如果一个抽象类里面的所有的方法都是抽象方法, ...
- 非阻塞套接字与IO多路复用
我们了解了socket之后已经知道,普通套接字实现的服务端的缺陷:一次只能服务一个客户端! 并且,为了使一个客户端能够不断收发消息,我们还要使用while循环来轮询,这极大地降低了我们的效率 acce ...
- Linux Shell脚本简介
Shell 诞生于 Unix,是与 Unix/Linux 交互的工具,单独地学习 Shell 是没有意义的,请先参考Unix/Linux入门教程,了解 Unix/Lunix 基础. 近几年来,Shel ...
- iOS日常学习 - App之间常用的五种通信方式及适用场景总结
本文为转载学习,原文地址 iOS系统是相对封闭的系统,App各自在各自的沙盒(sandbox)中运行,每个App都只能读取iPhone上iOS系统为该应用程序程序创建的文件夹AppData下的内容,不 ...
- windows系统下载地址大全&大白菜下载和教程
win10的 Windows10 64位纯净系统下载(不建议,后面的有原版) http://cjxt.sysdaa.com/down.php?post=win10-64&action=bend ...
- activity启动模式之singleTop
activity启动模式之singleTop 一.简介 二.设置方法 在AndroidManifest.xml中将要设置为singleTop启动模式的页面进行配置 <activity andro ...
- ubuntu 编译 vim+lua
mac $ brew install vim --with-cscope --with-lua --override-system-vim 安装spf13-vim见下面linux部分. 如果安装mac ...
- datagrid中用tooltip
function msgFormat(value,row){ value = value.replace(/ /g," "); return '<span title='+ ...
- js监测滚动条到达最底边
scroll : function(){ $(window).scroll(function () { var scrollTop = $(this).scrollTop(); var scrollH ...
- C++多态、虚函数、纯虚函数、抽象类
多态 同一函数调用形式(调用形式形同)可以实现不同的操作(执行路径不同),就叫多态. 两种多态: (1)静态多态:分为函数重载和运算符重载,编译时系统就能决定调用哪个函数. (2)动态多态(简称多态) ...