zoukankan      html  css  js  c++  java
  • 生成器 推导式 生成器表达式

    一、生成器

    生成器的实质就是迭代器

    以下有三种获取生成器

    1.通过生成器函数

    2.通过推导式来实现生成器

    3.通过数据的转换获取生成器

    def func():
        print("111")
        return 222
    ret = func()
    print(ret)
    # 结果:
    # 111
    # 222

    把return换成yield就是一个生成器

    def func():
        print("111")
        yield 222
    ret = func()
    print(ret)

    结果是:<generator object func at 0x0000000001DF0D00>

    生成器的本质就是迭代器,通过_next_()来执行生成器。

    def func():
        print("111")
        yield 222
    ret = func()
    wn = ret.__next__()
    print(wn)
    # 结果:
    # 111
    # 222

    这时,return 和 yield 的作用是一样的,都是返回数据

    def func():
        print("111")
        yield 222
        print("333")
        yield 444
    ret = func()
    ret1 = ret.__next__()
    print(ret1)
    ret2 = ret.__next__()
    print(ret2)
    ret3 = ret.__next__()
    print(ret3)
    # 结果:
    # 111
    # 222
    # 333
    # 444
    # Traceback (most recent call last):
    #   File "E:/python15期/生成器  推导式/lianxi.py", line 28, in <module>
    #     ret3 = ret.__next__()
    # StopIteration

    当程序执行完最后一个yield,后面继续执行_next_()程序会报错。而且,return是直接终止函数,而yield是分段执行函数

    send方法   和_next_()一样都执行下一个yield

    def eat():
        print("你吃什么啊")
        a = yield "馒头"
        print(a)
        b = yield "面条"
        print(b)
        c = yield "米饭"
        print(c)
        yield "over"
    ret = eat()   # 拿到生成器
    food = ret.__next__()
    print(food)
    food1 = ret.send("咸菜")
    print(food1)
    food2 = ret.send("红烧肉")
    print(food2)
    food3 = ret.send("白菜")
    food4 = ret.send("猫粮")
    print(food4)

    send 和 _next_() 的区别:
    1.都是让生成器向下走一次

    2.send 可以给上一个yield位置传值,不能给最后一个yield发送值。在第一次执行生成器代码的时候,不能使用send(),send()括号里必须有元素。

    二、推导式

    列表推导式:[结果 for循环  条件判断]

    字典推导式: {k:v for循环 条件筛选}

    集合推导式: {k for循环 条件}

    三、生成器表达式
            (结果 for循环 条件)
            特点:
                1. 惰性机制
                2. 只能向前
                3. 节省内存(鸡蛋)

  • 相关阅读:
    为什么RedLock并不能100%解决Redis做分布式锁的问题?
    阿里巴巴sentinel熔断降级(请求方是浏览器、请求方是应用两种方式考虑)
    阿里巴巴sentinel里面熔断里面RT是什么意思?(是什么单词的缩写)
    人生而孤独,却渴望陪伴。
    教你从官网下载commons-logging jar包(授人鱼不如授人以渔)
    spring5学习笔记-demo1
    企业网络规划
    scapy 查找自己的网卡(默认网卡)
    前端开发中常用的几种设计模式
    webpack打包原理
  • 原文地址:https://www.cnblogs.com/sypx/p/9469564.html
Copyright © 2011-2022 走看看