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__()
原文地址:https://www.cnblogs.com/alifetimelove/p/10753379.html
时间: 2024-10-19 03:06:25