python note 12 生成器

Posted alifetimelove

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python note 12 生成器相关的知识,希望对你有一定的参考价值。

1、生成器函数

# 函数中如果有yield 这个函数就是生成器函数. 生成器函数() 获取的是生成器. 这个时候不执行函数
# yield: 相当于return 可以返回数据. 但是yield不会彻底中断函数. 分段执行函数.
# gen.__next__() 执行函数. 执行到下一个yield.
# gen.__next__() 继续执行函数到下一个yield.

不用生成器可能导致内存不够

def order():
    lst = []
    for i in range(10000):
        lst.append("衣服"+str(i))
    return lst
ll = order()
print(ll)

使用生成器逐个输出

def order():
    for i in range(10000):
        yield "衣服"+str(i)
g = order() # 获取生成器
mingwei = g.__next__()
print(mingwei)
#输出衣服0
zhaoyining = g.__next__()
print(zhaoyining)
#输出衣服1

2、send()用法

# send() 和__next__()是一样的. 可以执行到下一个yield, 可以给上一个yield位置传值

def func():
    print("我是第一个段")
    a = yield 123
    print(a)
    print("石可心是第二段")
    b = yield 456
    print(b) 
    print("赵一宁是第三段")
    c = yield 789
    print(c)
    print("刘伟是最后一个段")
    yield 79  # 最后收尾一定是yield,否则会报错
g = func()
print(g.__next__())#没有上一个yield 所以不能使用send() 开头必须是__next__()
print(g.send("煎饼果子"))#赋值给a
print(g.__next__())
print(g.__next__())
#我是第一个段
#123
#煎饼果子
#石可心是第二段
#456
#None
#赵一宁是第三段
#789
#None
#刘伟是最后一个段
#79

 

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)
#我吃什么啊
#馒头
#a= 胡辣汤
#鸡蛋灌饼
#b= 狗粮
#韭菜盒子
#c= 猫粮
#GAME OVER

# for的内部一定有__next__()

def func():
    yield 1
    yield 13
    yield 26
    yield 88
    yield 46
    yield 100
for i in func(): # for的内部一定有__next__()
    print(i)
print(list(func())) # 内部都有__next__()

 

以上是关于python note 12 生成器的主要内容,如果未能解决你的问题,请参考以下文章

Python 基础 - Day 4 Learning Note - Generator 生成器

Python代码阅读(第40篇):通过两个列表生成字典

Note

JavaScript 有用的代码片段和 trick

python学习道路(day5note)(列表生成式,生成器,装饰器,常用模块)

python学习道路(day12note)(mysql操作,python链接mysql,redis)