# 生成器的本质就是迭代器,在python中有两种方式来获取生成器:
# 1.通过生成器函数
# 2.通过生成器表达式来实现生成器
def func():
print("123")
yield "你好!" # 该函数当中有yield,该函数就是一个生成器函数,yield也有返回的意思
gen = func() #生成器函数在被执行的时候,创建生成器
print(gen)
# <generator object func at 0x00000216F3854040>
# 生成器对象 func 在 0x00000216F3854040
ret = gen.__next__() # 可以让生成器函数执行到下一个yield
# 输出 123
print(ret)
# 输出 你好
# 在一个函数当中可以有多个yield
def func():
print(11)
yield "你好"
print(22)
yield "你不好"
print(33)
yield "你很好"
gen = func()
r = gen.__next__()
print("接受到的数据", r)
r2 = gen.__next__()
print("接受到的数据", r2)
r3 = gen.__next__()
print("接受到的数据", r3)
r4 = gen.__next__()
print("接受到的数据", r4) # 当程序后面没有yield之后,此时会报错,StopIteration
"""
生成器函数:
1. 里面有yield
2. 生成器函数在被执行的时候,实际是创建一个生成器函数出来
3. 必须使用__next__()来执行一段代码,会自动执行到下一个yieldj结束
4. yield也有返回的意思,可以让下一个函数分段执行
5. 当后面没有yield之后,再次使用__next__()会报错StopIteration
"""
# 生成器函数的最大作用就是节省内存
# 举个例子
# 买一万件衣服
# 常规做法
def order():
lst = []
for i in range(10000): # 会比较消费内存
lst.append(f"衣服{i}")
return lst
lst = order()
print(lst)
# 生成器,执行一次next就只会输出一次
def order():
for i in range(10000):
yield f"衣服{i}"
lst = order()
print(lst.__next__())
#
def order():
lst = []
for i in range(10000):
lst.append(f"衣服{i}")
if len(lst) == 50:
yield lst
lst = []
lst = order()
print(lst.__next__())
"""
__next__
send
相同点:可以执行到下一个yield
不同点:send可以给上一个yield位置传参
"""
def func():
print("111")
a = yield "你好"
print("222", a)
b = yield "我不好"
print("333", b)
c = yield "你也不好"
yield "红烧"
g = func()
r1 = g.__next__() # 第一次执行必须用next 不能使用send
print(r1)
r2 = g.send("呵呵") # send给上一个yield位置发送 “呵呵”
print(r2)
标签:__,python,生成器,基础,yield,next,lst,print From: https://www.cnblogs.com/Wesuiliye/p/17156524.html