• 生成器基础


    一、需求

      希望从格式化打印"打印第%s次"%d ,此时一直打印2000000个。(直接range(2000000)会卡,不希望卡)

    二、生成器定义

      1.生成器事实上也是迭代器的衍生,自己写的一个生成器,可以极大程度上节省内存。

      2.函数使用yield。

      3.yield:效果和return差不多,但是不能和return一起出现,yield返回数值之后,函数停留在执行到的地方不动。而return会停止,下次调用会重来。

    三、示例

    def printx():
        for i in range(2000000):
            yield 'x=%s' % i
    
    g=printx()
    g1=printx()            #这是两个生成器
                     #g.__next__():取一个
    count=0 for i in g: print(i)        #一边调一边打印。一边生成数据一边处理。 count+=1 if count>50:     #任何时候 把count值再加,就可用接着取 break print('***',g.__next__()) #*** x=51

      在其中,g=printx()时,实际上并没有创建range(2000000),而在下方打印时,才从内存,一个一个生成返回数据。


    四、介绍几个函数:

    __iter__():有此方法说明可以迭代。

    __next__():有这个方法说明可以一个一个取出来。

    __setstate__():可以指定从哪个位置开始取。

    __add__():在使用加法的时候,实际上机器翻译成调用__add__方法。

     (双下方法一般很少直接调用,一般都是用其他语法触发)

    五、总结

      1.生成器的本质就是迭代器

      2.生成器的表现形式

        1)生成器函数

        2)生成器表达式

      3.生成器函数:含有yield关键字的函数就是生成器函数。

      4.生成器函数特点:

        1)调用函数之后函数不执行,返回一个生成器。

        2)调用__next__方法之后会取到一个值。直到取完最后一个之后会报错。

      5.从生成器中取值的几个方法:

        1)next

    def generator():
        for i in range(20000000):
            yield "打印第%s次"%(i+1)
    
    g=generator()
    print(g.__next__())    #打印第1次

           2)for

    def generator():
        for i in range(20000000):
            yield "打印第%s次"%i
            
    g=generator()
    num=0
    for i in g:
        num+=1
        if num>50:
            break
        print(i)

        3)数据类型的强制转换

    def generator():
        for i in range(20):   #数据很小,
            yield "打印第%s次"%(i+1)
    
    g=generator()
    print(list(g))         #将生成器转换为列表,数据同时存在于内存中。(占内存)

      

  • 相关阅读:
    mysql更新语句中的safe_mode
    MySQL数据类型详解
    刚更新完版本就炸了:java.lang.NoClassDefFoundError: org/apache/commons/io/output/UnsynchronizedByteArrayOutputStream
    微信支付分创建支付分订单+签名+验签
    根据序列号加密生产4*4的密码,如:X9PL-TERY-NOZN-GMF1
    对称加密:AES
    MySQL按中文排序
    腾讯云COS分片上传
    Linux中jar包指定端口、配置文件启动并记录日志
    Java8新特性两个关联集合合并成父子级
  • 原文地址:https://www.cnblogs.com/lowislucifer/p/10993723.html
Copyright © 2020-2023  润新知