迭代器

迭代器内容有七:
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

原文地址:https://www.cnblogs.com/twinkle-/p/10506263.html