• 生成器和生成器表达式


     

    实例

    1、生成器函数:就是把函数中的return换成了yield

    def gen():
        print("爽歪歪")
        yield "娃哈哈" # 将此处的return换成yield
        print("酸酸乳")
        yield "AD钙奶" #可以让我们的函数分段运行
        print("黄焖鸡米饭")

    2、生成器的的取值方法:__next__( )和send( )

    func():
        print("水饺")
        a = yield "大馅水饺"
        print("a=", a)
        print("烧饼")
        b = yield "武大郎烧饼"
        print("b=",b)
        print("老婆饼")
        c = yield "只要老婆不要饼"
        print("c=", c)
    gen = func() # 生成器
    print("返回值是:", gen.__next__())
    print("返回值是:",gen.send("混沌面")) #  和__next__()一样也是向下找yield. 给上一个yield传值
    print("返回值是:",gen.send("胡辣汤")) #  和__next__()一样也是向下找yield. 给上一个yield传值
    print("返回值是:",gen.send("马拉")) #  和__next__()一样也是向下找yield. 给上一个yield传值

    注:send( )先将括号内部的内容复制给前面yield的变量,再继续寻找下一个yield,找不到,报错StopIteration

      send( )不能放在开头,也不能放置在末尾。

    3、yield from语法

    def gen():
        lst = ["⿇花藤", "胡辣汤", "微星牌饼铛", "Mac牌锅铲"]
        lst2 = ["饼铛还是微星的好", "联想不能煮鸡蛋", "微星就可以", "还可以烙饼"]
        yield from lst
    #等价于
    ‘’‘
     yield lst[0]
     yield lst[1]
     vield lst[2]
     yield lst[3]
    ’‘’
        yield from lst2

    4、迭代器存有的数值为222,而不是111  222

    def func():
        print(111)
        yield 222
    
    g = func()
    print(lst(g))#[222]
    print(g.__next__()) #报错StopIteration

    5、列表推导式格式[结果 for循环1 for循环2 if判断 ]

    # 寻找名字中带有两个e的⼈的名字 name.count("e") == 2
    names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven','Joe'],
             ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]
    
    lst = [name for el in names for name in el if name.count("e") == 2]
    print(lst)

    6、字典和集合的推导式与列表相同:{结果 for循环 if判断}

    dic = {"张无忌":"赵敏", "杨过":"小龙女", "郭靖":"黄蓉"}
    # 把字典中的key和value互换
    dic = {"赵敏":"张无忌", "小龙女":"杨过", "黄蓉":"郭靖"}
    dic1 = { v:k for k, v in dic.items()}  
    print(dic1)

    7、生成器的特点:

     本质是迭代器. __next__()
     1. 省内存
     2. 惰性机制
     3. 只能向前

    8、深坑

    def func(): # 生成器函数
        print(111)
        yield 222
    
    g = func() #  生成器 -> 没有执行过__next__()
    g1 = (i for i in g) # 生成器表达式. 也没有__Next__()
    g2 = (i for i in g1) # 生成器表达式. 也没有__Next__()
    # 到此为止, 没有人拿过值
    
    print(list(g2)) # 111 [222]
    print(list(g)) #  []
    print(list(g1)) # []

  • 相关阅读:
    codeforces 519E A and B and Lecture Rooms lca倍增
    codeforces 702E Analysis of Pathes in Functional Graph 倍增
    hdu 5126 stars cdq分治套cdq分治+树状数组
    hdu 5442 Favorite Donut 最大表示法+kmp
    hdu 5446 Unknown Treasure 中国剩余定理+lucas
    hdu 5769 Substring 后缀数组
    codevs 1913 数字梯形问题 费用流
    Python for Infomatics 第13章 网页服务二(译)
    Python for Infomatics 第13章 网页服务一(译)
    Python for Infomatics 第12章 网络编程六(译)
  • 原文地址:https://www.cnblogs.com/angle6-liu/p/9892290.html
Copyright © 2020-2023  润新知