迭代器
迭代器内容有七:
1.导言
2.迭代器的概念
3.迭代器的作用
4.for循环执行的本质
5.迭代器的好处
6.生成器
7.监听文件输入的栗子
导言:
能用for循环的有:list,dict,set,str,tuple,f = open(),range(),enumerate枚举
dir(数据类型)———>可以得到此数据类型的所有方法
eg:print(dir([])) 打印列表拥有的所有方法
只要是能被for循环的数据类型就一定拥有__iter__方法
一个列表执行了__iter__之后的返回值就是一个迭代器
如:[].__iter__()
列表是可迭代的,但不是迭代器
带有双下划线的方法叫做双下方法 如:_add_
__length_hint__() 元素个数
__setstate__ 指定从哪个位置取值
__next__ 通过__next__就可以从迭代器中一个一个取值
迭代器的概念:
可迭代协议:只要含有__iter__方法的但是可迭代的
迭代器协议:内部含有__iter__和__next__方法的就是迭代器
注:
①可以被for循环的都是可迭代的
②可迭代的内部都有__iter__方法
③只要是迭代器就一定可迭代
④可迭代的__iter__()方法就可得到一个迭代器
⑤__next__()可获取迭代器一个一个的值
⑥for循环实际上就是再使用迭代器
迭代器的作用:
通过打印未知变量的结果,判断此变量是否是可迭代的,从而可知能否用for循环
(当我们遇到一个未知的变量,不能确定能不能for循环时,就判断它是否可迭代)
for循环的执行本质:
for i in L: pass #相当于:
#第一步:iterator = L.__iter__() #第二步:iterator.__next__()
迭代器的好处:
①很方便使用,且只能取所有的数据一次
②从容器类型中一个一个的取值,会把所有的值都取到
③可以节省内存空间,迭代器并不会在内存中占用一大块内存,而是随着循环每次生成一个
生成器:本质是迭代器
①只要含有yield关键字的函数都是生成器函数
②yield只能卸载函数里,而且不能与return同用
③生成器函数执行之后会得到一个生成器作为返回值,若想要打印返回值应该用__next__()
def generator(): print(2) yield 'a' ret = generator() print(ret) #结果是生成器:<generator object generator at 0x0000028AB6DBF678> def generator(): print(2) yield 'a' ret = generator() g = ret.__next__() print(g) #结果是:2 a
写生成器的方式有两种:
①生成器函数——本质上就是我们自己写的函数
②生成器表达式
监听文件输入的栗子:
def tail(filename): f = open(filename,encoding='utf-8') while True: line = f.readline() if line.strip(): yield line.strip() g = tail('file') for i in g: print(i) #好处:达到监听过滤的效果;可以对函数内部的值监听,判断,也可以换不同的打印形式;如: #如果文件中有’python‘字样就打印,否则不打印,即: for i in g: if 'python' in i: print('***',i)
判断某个数据类型是否含有__iter__的方法是
print('__iter__' in dir(数据类型))
返回的是true 或者false