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('烧鹿尾')
· 使用 .NET Core 实现一个自定义日志记录器
· [杂谈]如何选择:Session 还是 JWT?
· 硬盘空间消失之谜:Linux 服务器存储排查与优化全过程
· JavaScript是按顺序执行的吗?聊聊JavaScript中的变量提升
· [杂谈]后台日志该怎么打印
· 2000 Star,是时候为我的开源项目更新下功能了
· 好消息,在 Visual Studio 中可以免费使用 GitHub Copilot 了!
· 工作中这样用MQ,很香!
· 使用 .NET Core 实现一个自定义日志记录器
· 没事别想不开去创业!