import time def test(): print("开始生孩子!!!") yield "儿子" time.sleep(2) #两秒之后再执行 print("开始生孙子啦") time.sleep(2) yield "孙子" res=test() print(res.__next__()) #运行完这行,会显示儿子,而这个函数会停留再这里(保留函数的运行状态,区别于return会使函数结束,yield会让函数停留再某一阶段) print(res.__next__()) #等两秒之后,会从上一步迭代器停留的位置继续运行,会显示孙子
👆👆👆以上是通过函数的形式生成迭代器。(能够通过—next—挨个输出)
生成器函数的好处:
举例:两种方法卖包子
方法1:全生产出来,再去卖。需要创立一个列表,把生产出来的所有包子全部放进去
def baozi_product():
ret=[]
for i in range(1,100):
ret.append("第%s屉包子" %i)
return ret
res=baozi_product()
print(res)
方法2:生产一个,就卖一个,这里需要用到yield生成一个迭代器,然后通过next函数进行一个个的输出,而且要保留函数的运行状态
def baozi_product():
for i in range(1,100):
yield "第%s屉包子" %i
res=baozi_product()
print(res.__next__()) #输出结果为第1屉包子,遇到yield会停留,等到下一个next时,再继续进行循环
print(res.__next__()) #输出结果为第2屉包子
print(res.__next__()) #......
例题:母鸡下蛋的传说
需求1:母鸡下蛋,下100个鸡蛋,没有生成器
def mujixiadan():
ret=[]
for i in range(1,101):
ret.append("egg%s" %i)
return ret
print(mujixiadan())
#输出一个1-100个列表
(缺点:占用空间大,效率较低)
需求2:下一个鸡蛋给一个鸡蛋
def mujixiadan():
for i in range(1,101):
print("第%s个出来啦"%i)
yield "给你第%s个蛋"%i
print("下蛋中")
res=mujixiadan()
print(res.__next__()) #来一个人取鸡蛋,就下一个
print(res.__next__())
print(res.__next__())
浙公网安备 33010602011771号