python基础三之生成器

1、什么是生成器
在函数内但凡有yield关键字,再调用函数就不会执行函数体代码,得到返回值就是一个生成器对象,
强调:生成器本质就是迭代器
 
 
next(g)过程:
会触发生成器g所对应的函数的执行,直到遇到yield才停下来,然后把yiled后的返回值当做
本次next操作的结果
 
 
2、为何要用生成器:
学习生成器是为了掌握一种自定义迭代器的方式
 
3、总结yield:
1、yield提供一种自定义迭代器的方式
2、与return对比,都能返回值,都能返回多个值,都没有类型限制,而return只能返回一次值,而yield可以返回多次值(yield可以
帮我们保存函数的执行状态)
def func():
print('first')
yield 1 # 暂停
print('second')
 
yield 2 # 暂停
print('third')
 
 
# g=func()
# print(g)
 
# res1=next(g) #g.__next__()
# print(res1)
#
# res2=next(g) #g.__next__()
# print(res2)
#
# res3=next(g) #g.__next__()
 
 
# g=func()
# for item in g: #item=next(g)
# print(item)

first
1
second
2
third
 
range(1,100,2)
# python2的做法
def my_range(start,stop,step=1):
res=[]
while start < stop:
res.append(start)
start+=step
return res
res=my_range(1,1000,2)
 
print(res)
 
python3的做法
def my_range(start,stop,step=1):
# print('开始运行')
while start < stop:
yield start
start+=step
 
# print('结束运行')
 
# obj=my_range(1,1000,2)
 
# res1=next(obj)
# print(res1)
#
# res2=next(obj)
# print(res2)
 
for item in my_range(1,10,2):
print(item)
========================================================================================================================================================
yield表达式形式的应用:
 
#yield关键字的另外一种使用形式:表达式形式的yield
def eater(name):
    print('%s 准备开始吃饭啦' %name)
    food_list=[]
    while True:
        food=yield food_list
        print('%s 吃了 %s' % (name,food))
        food_list.append(food)

g=eater('egon')
g.send(None) #对于表达式形式的yield,在使用时,第一次必须传None,g.send(None)等同于next(g)
g.send('蒸羊羔')
g.send('蒸鹿茸')
g.send('蒸熊掌')
g.send('烧素鸭')
g.close()
g.send('烧素鹅')
g.send('烧鹿尾')

  

posted @   cyh追梦寻  阅读(87)  评论(0编辑  收藏  举报
编辑推荐:
· 使用 .NET Core 实现一个自定义日志记录器
· [杂谈]如何选择:Session 还是 JWT?
· 硬盘空间消失之谜:Linux 服务器存储排查与优化全过程
· JavaScript是按顺序执行的吗?聊聊JavaScript中的变量提升
· [杂谈]后台日志该怎么打印
阅读排行:
· 2000 Star,是时候为我的开源项目更新下功能了
· 好消息,在 Visual Studio 中可以免费使用 GitHub Copilot 了!
· 工作中这样用MQ,很香!
· 使用 .NET Core 实现一个自定义日志记录器
· 没事别想不开去创业!
点击右上角即可分享
微信分享提示