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

一、生成器

生成器的实质就是迭代器

以下有三种获取生成器

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

原文地址:https://www.cnblogs.com/sypx/p/9469564.html