zoukankan      html  css  js  c++  java
  • 生成器基础

    一、需求

      希望从格式化打印"打印第%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))         #将生成器转换为列表,数据同时存在于内存中。(占内存)

      

  • 相关阅读:
    【阿里笔试2】给定一组只包含数字的字符串,请恢复到有效的非私有网段地址组合
    【阿里笔试1】 把一个数组分成四份,三个分割点不算进求和中,使得每份的和要相同。
    【转载】Java基础之String中equals,声明方式,等大总结
    8-网易人力资源部门面试
    登录页面简单模板
    微机原理笔记(2)------8255A芯片
    微机原理笔记(1)------8259A芯片
    数据库复习笔记(4)------关系数据
    数据库复习笔记(3)------E-R模型
    数据库复习笔记(2)------关系代数
  • 原文地址:https://www.cnblogs.com/lowislucifer/p/10993723.html
Copyright © 2011-2022 走看看