zoukankan      html  css  js  c++  java
  • 21 迭代器、生成器

    # 迭代器的概念
    # 迭代器协议 —— 内部含有__next__和__iter__方法的就是迭代器

    # 迭代器协议和可迭代协议
    # 可以被for循环的都是可迭代的
    # 可迭代的内部都有__iter__方法
    # 只要是迭代器 一定可迭代
    # 可迭代的.__iter__()方法就可以得到一个迭代器
    # 迭代器中的__next__()方法可以一个一个的获取值

    # 只要是能被for循环的数据类型 就一定拥有__iter__方法

    #for
    #只有 是可迭代对象的时候 才能用for
    #当我们遇到一个新的变量,不确定能不能for循环的时候,就判断它是否可迭代

    #迭代器的好处:
    # 从容器类型中一个一个的取值,会把所有的值都取到。
    # 节省内存空间
    #迭代器并不会在内存中再占用一大块内存,
    # 而是随着循环 每次生成一个
    # 每次next每次给我一个

    # 生成器 —— 迭代器
    # 生成器函数 —— 本质上就是我们自己写得函数

    #只要含有yield关键字的函数都是生成器函数
    # yield不能和return共用且需要写在函数内

    #生成器函数 : 执行之后会得到一个生成器作为返回值

    #文件监听的例子:

    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:
        if 'python' in i:
            print('***',i)

    # 迭代器和生成器
    # 迭代器:
    # 双下方法 : 很少直接调用的方法。一般情况下,是通过其他语法触发的
    # 可迭代的 —— 可迭代协议 含有__iter__的方法('__iter__' in dir(数据))
    # 可迭代的一定可以被for循环
    # 迭代器协议: 含有__iter__和__next__方法
    # 迭代器一定可迭代,可迭代的通过调用iter()方法就能得到一个迭代器
    # 迭代器的特点:
    # 很方便使用,且只能取所有的数据取一次
    # 节省内存空间

    # 生成器
    # 生成器的本质就是迭代器
    # 生成器的表现形式
    # 生成器函数
    # 生成器表达式
    # 生成器函数:
    #含有yield关键字的函数就是生成器函数
    #特点:
    #调用函数的之后函数不执行,返回一个生成器
    #每次调用next方法的时候会取到一个值
    #直到取完最后一个,在执行next会报错

    # 写生成器实现:有一个文件,从文件里分段读取内容
    # readline
    # read(10)
    # 在读出来的内容前面加上一个'***',再返回给调用者

    def generator():
        for i in range(20):
            yield '哇哈哈%s'%i
    
    g = generator()  #调用生成器函数得到一个生成器
    print(list(g))
    ret = g.__next__()     #每一次执行g.__next__就是从生成器中取值,预示着生成器函数中的代码继续执行
    print(ret)
    num = 0
    for i in g:
        num += 1
        if num > 50:
            break
        print(i)

    # 从生成器中取值的几个方法
    # next
    # for
    # 数据类型的强制转换 : 占用内存

  • 相关阅读:
    顺序栈的基本操作(C语言)
    简单加密-维吉尼亚
    单链表的反转
    单链表的排序
    SVN信息泄露漏洞
    SQLi-labs Page-2_Less-21---Less-28a
    dedecms 任意密码重置 验证凭证回传
    ThinkCMF缓存Getshell
    ThinkCMF X2.2.0多处SQL注入漏洞
    SQLi-LABS Page-4(Challenges)
  • 原文地址:https://www.cnblogs.com/bydzxzy/p/9655710.html
Copyright © 2011-2022 走看看