• 生成器函数以及表达式,推倒式


    1. 生成器和生成器函数
    生成器的本质就是迭代器
    生成器的三种创建办法:
    1.通过生成器函数
    2.通过生成器表达式创建生成器
    3.通过数据转换
    生成器函数:
    函数中包含了yield的就是生成器函数
    注意:生成器函数被执行. 获取到的是生成器. 而不是函数的执行
    生成器表达式:
    (结果 for 变量 in 可迭代对象 if 筛选)
    取值:
    1. __next__()
    2. send(值) 给上一个yield位置传一个值, 第一个和最后一个yield不用传值
    3. 可以for循环
    4. list(g)

    生成器函数
    def func():
        print("我是周杰伦")
        yield "昆凌"  # 函数中包含了yield, 当前这个函数就不再是普通的函数了. 是生成器函数
        print("我是王力宏")
        yield "李云迪???"
        print("我是笛卡尔积")
        yield "笛卡尔积是谁"
        print("你好啊") # 最后一个yield之后如果再进行__next__() 会报错
    g = func()
    print(g.__next__())
    print(func().__next__())
    
    g1 = func()
    g2 = func()
    print(g1.__next__())
    print(g1.__next__())
    
    print("==============")
    print(g2.__next__())
    
    
    g = func()  # 通过函数func()来创建一个生成器
    print(g.__next__()) # 周杰伦
    print(g.__next__()) # 王力宏
    print(g.__next__()) # 笛卡尔积
    print(g.__next__())
    
    return 直接返回结果. 结束函数的调用
    yield 返回结果.可以让函数分段执行
    
    def func():
        lst = []
        for i in range(1,100001):
            lst.append("衣服%s" % i)
        return lst
    
    def gen():
        i = 1
        while i < 100001:
            yield "衣服%s" % i
            i = i + 1
    g = gen()
    print(g.__next__())
    print(g.__next__())
    print(g.__next__())
    print(g.__next__())
    print(g.__next__())
    print(g.__next__())
    
    
    def func():
        yield 11
        yield 22
        yield 33
        yield 44
    
    
    g = func()  # 拿到的是生成器. 生成器的本质是迭代器. 迭代器可以被迭代 生成器可以直接for循环
    
    for i in g:
        print(i)    # 本质上执行的是__next__()
    
    it = g.__iter__()
    while True:
        try:
            print(it.__next__())
        except StopIteration:
            break
    
    send
    def func():
        print("大碴粥")
        a = yield "11"
        print(a)
        print("狗不理")
        b = yield "22"
        print(b)
        print("大麻花")
        c = yield "33"
        print(c)
    
    g = func()
    print(g.__next__())
    print(g.send(1))
    print(g.send(2))
    print(g.send(3))
    
    __next__() 可以让生成器向下执行一次
    send() 也可以让生成器向下执行一次, 给上一个yield传一个值, 第一个不能用send(). 最后一个也不要传值
    
    
    def eat():
        print("我吃什么啊")
        a =  yield  "馒头"
        print("a=",a)
        b =  yield  "大饼"
        print("b=",b)
        c =  yield  "韭菜盒子"
        print("c=",c)
        yield  "GAME OVER"
    
    gen = eat()      # 获取⽣成器
    
    ret1 = gen. __next__ ()
    print(ret1)
    ret2 = gen.send("胡辣汤")
    print(ret2)
    ret3 = gen.send("狗粮")
    print(ret3)
    ret4 = gen.send("猫粮")
    print(ret4)
    
    
    def func():
        yield 11
        yield 22
        yield 33
        yield 44
    g = func()
    lst = list(g)   # 可迭代对象
    print(lst)
    

      

    生成器表达式
    g = (i for i in range(10))
    print(list(g))
    
    gen = ("麻花藤我第%s次爱你" % i for i in  range(10))
    for i in  gen:
        print(i)
    
    生成器的惰性机制
    def func():
        print(111)
        yield  222
    g = func()
    g1 = (i  for i in  g)
    g2 = (i  for i in  g1)
    
    print(list(g))
    print(list(g1))
    print(list(g2))
    

      


    2. 各种推倒式和生成器表达式
    1. 列表推倒式 [结果 for 变量 in 可迭代对象 if 筛选]
    2. 字典推倒式 {结果 for 变量 in 可迭代对象 if 筛选} 结果=>key:value
    3. 集合推倒式 {结果 for 变量 in 可迭代对象 if 筛选} 结果=>key

    字典推倒式

    # dic = {"a":"b", "c":"d"}
    # # 把字典中的key:value互换 .{"b":"a", "d":"c"}
    # new_dic = {dic[key]:key for key in dic}
    # print(new_dic)
    
    # lst1 = ["alex", "wusir", "taibai", "ritian"]
    # lst2 = ['sb', "很色", "很白", "很牛"]
    # # {"alex":"sb", "wusir":"很色"}
    #
    # dic = { lst1[i]:lst2[i] for i in range(len(lst1))}
    # print(dic)

    集合推倒式
    lst = ["马化腾", "马化腾", "王建忠", "张建忠", "张建忠", "张雪峰", "张雪峰"]

    s = {i for i in lst} # 集合推倒式
    print(s)

  • 相关阅读:
    微信小程序加密解密 C# 以及 填充无效,无法被移除错误的解决方案 Padding is invalid and cannot be removed
    腾讯云 docker 镜像 dotnet/core sdk aspnet
    ImageMagick PDF到JPG有时会导致黑色背景
    VS2019 发布单文件
    MySQL 更新语句执行过程 WAL redolog binlog
    MySQL 查询语句执行过程
    让MySQL为我们记录执行流程
    SQL基础随记1 SQL分类 常用函数 ALL ANY EXISTS IN 约束
    初用MySQL Mysql示例库 Navicat15
    OldTrafford after 102 days
  • 原文地址:https://www.cnblogs.com/duanpengpeng/p/9329295.html
Copyright © 2020-2023  润新知