• 生成器基础


    一、需求

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

      

  • 相关阅读:
    java线程池实例
    多线程生产者消费者实例
    js函数
    if else语句
    JS中Math对象的常用方法说明
    引用类型的自定义数据排序——高淇JAVA300讲笔记
    引用类型的内置类大小比较(用Comparator接口实现)——高淇JAVA300讲笔记之Comparator接口
    引用类型的内置类大小比较(用Comparable接口实现)——高淇JAVA300讲笔记之Comparable接口
    冒泡排序——高淇JAVA300讲笔记之冒泡排序
    分拣存储02——高淇300讲笔记之分拣存储
  • 原文地址:https://www.cnblogs.com/lowislucifer/p/10993723.html
Copyright © 2020-2023  润新知