• 生成器 推导式 生成器表达式


    一、生成器

    生成器的实质就是迭代器

    以下有三种获取生成器

    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. 节省内存(鸡蛋)

  • 相关阅读:
    冒泡排序
    线程同步
    线程取消
    线程分离
    第3月第2天 find symbolicatecrash 生产者-消费者 ice 引用计数
    第3月第1天 GCDAsyncSocket dispatch_source_set_event_handler runloop
    第2月第25天 BlocksKit
    第2月第24天 coretext 行高
    第2月第6天 iOS 运行时添加属性和方法
    第2月第5天 arc invocation getReturnValue
  • 原文地址:https://www.cnblogs.com/sypx/p/9469564.html
Copyright © 2020-2023  润新知