zoukankan      html  css  js  c++  java
  • python生成器

    一 python生成器

    1 生成器的本质就是迭代器.(可迭代对象)
            生成器由生成器函数来创建或者通过生成器表达式来创建

    def p():

      print("hello world !")

      yield

    gen = p()  #  gen就是一个生成器,每次取p()都会是一个新的生成器

    gen_other = p()   gen 和gen_other是两个生成器

     2. 生成器函数         生成器函数:在函数中return换成yield. 这个函数就是生成器函数        

    def func():

      yield

    gen = func() 函数并不会被执行, 而是创建一个生成器对象

    取值:            

    gen.__next__() 下一个            

    gen.send() 可以给上一个yield传值, 第一次执行不能用send()

    def func():

      a = None

      for i in range(50):

        print(i)

       a = yield (i,a)

    gen = func()

    print(gen.__next__())

    print(gen.send("发票"))

    >>>0

        (0, None )

      1

      (1, "发票")

      

    特性:            

      1. 节省内存 (不获取执行结果是不执行,获取是按照yield的位置端点,可以避免数据过多是占用内存)           

      2. 惰性机制  (不主动获取是,不执行结果,用__next__()或者下一个yield之前的数据)          

      3. 只能向前(同一个生成器,执行按协定的顺序来,执行完毕之后不再重复执行)

    3. 各种推导式
            1.列表推导式: [结果 for循环 if条件]

      li = [x for x in range(5)]

      print(li)

      >>>[0, 1, 2, 3, 4, 5]
            2.字典推导式: { key: value for循环 if条件}

      dic = {k:k+10 for k in range(3) }

      print(dic)

      >>>{0: 10, 1: 11, 2: 12, 3: 13}
            3.集合推导式: {key for循环 if条件}

      se = {x for x in ["a", "a", "b","c", "1", "2", "1"]}

      print(se)

      >>>{"a", "b", "c", "1", "2"}

    4 生成器表达式

       (结果 for循环 if条件)

            惰性机制         记录在内存中的一段代码

      gen = (x for x in range(5))  #小括号中的它就是一个生成器表达式可以使用__next__(), 含有__iter__()

      gen.__next__()

      >>>0

      for i in gen :

      print(i)

      >>> 1

        2    

        3  

        4  

    for E

    1---------

    # def func():
    #     for i in range(1, 10000):
    #         yield "衣服%s" % i
    #
    # gen = func()
    # for i in range(50):
    #     yf = gen.__next__()
    # for i in range(50):
    #     yf = gen.__next__()
    # for i in range(50):
    #     yf = gen.__next__()

     2-----------

    def func():
        yield "麻花藤"
        yield "李彦宏"
        yield "马云"
        yield "刘强东"
    
    gen = func()
    # print(gen.__next__()) # 麻花藤
    # print(gen.__next__()) # 麻花藤
    # print(gen.__next__()) # 麻花藤
    # print(gen.__next__()) # 麻花藤
    
    # 生成器的本质是迭代器.
    # print("__iter__" in dir(gen))
    #
    # # 生成器可以直接使用for循环
    # # for el in gen:
    # #     print(el)
    #
    # lst = list(gen) # 把生成器中的每一个数据拿出来组合成一个列表
    # print(lst)
    

     3 -----

    def add(a, b):
        return a + b
    
    # 生成器函数, 0-3
    def test():
        for r_i in range(4):
            yield r_i
    
    # 获取到生成器
    g = test() # 惰性机制
    
    for n in [2, 10]:
        g = (add(n, i) for i in g)  # 循环的内部也是一个生成器
    
    #  __next__()
    # list()
    
    print(list(g)) # 刚开始拿数据
    # 生成器记录的是代码
    
  • 相关阅读:
    Keyboarding题解
    埃及分数 解题报告
    小木棍加强版解题报告
    扩展欧几里得
    luoguP4999 烦人的数学作业
    中国剩余定理
    20201115gryz模拟赛解题报告
    扩展欧几里得算法
    斐蜀定理
    CSP2020-S游记
  • 原文地址:https://www.cnblogs.com/tcpblog/p/9671001.html
Copyright © 2011-2022 走看看