• 迭代器


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

  • 相关阅读:
    6月15日学习日志
    6月14日学习日志
    6月13日学习日志
    6月12日学习日志
    给建民哥的意见
    6月10日学习日志
    6月9日学习日志
    6月8日学习日志
    梦断代码读书笔记3
    第二次冲刺(六)
  • 原文地址:https://www.cnblogs.com/twinkle-/p/10506263.html
Copyright © 2020-2023  润新知