Python进阶系列连载(7)——生成器(下)
作者:王大伟
Python爱好者社区唯一小编
博客:https://ask.hellobi.com/blog/wangdawei
前文传送门:
Python进阶系列连载(1)——那些容易被忽略的问题(上)
Python进阶系列连载(2)——那些容易被忽略的问题(中)
Python进阶系列连载(3)——那些容易被忽略的问题(下)
如果还没看过我的入门连载部分,先看:
Python从零开始系列连载(25)——Python的random模块简单使用(入门知(姿)识(势)学习的最后一篇(片))
当然,小编的免费入门课程已经有咯,看过连载的朋友可以看看视频再快速梳理一遍~
视频传送门:点击文末阅读原文
send()退化为next()
上节课说到send()的一个问题:
这是为什么呢?
小红:老师,我想了两天终于想到了!
哦?你说说
小红:因为 f.send()取生成器第一个对象,并且传入了一个参数‘Python’
但是,并没有变量去接收这个参数!所以报错了!
是的,之前我们的代码是这样的:
注意,我们调用第一个对象使用next,并没有传入参数!
而第二次使用send调用下一个对象时候,传入的参数相当于代替了yield i
也就是赋值给了item,所以没报错
小明:老湿,你说send是加强版的next,我想给send退化到next,可以么?
这个嘛,是可以的!小明你试试!
小明:大家都退后!我要装逼了!
小明:不传参数竟然不行!!!
小明啊,应该是这样的!
传入None才对!
小明:我不服!老湿,你说这生成器很厉害,具体有啥应用呢?学了没用岂不是很鸡肋?
这个嘛!其实是有用的,我先剧透一下!
多任务——协程
我们先介绍一下多任务
多任务处理是指用户可以在同一时间内运行多个应用程序,每个应用程序被称作一个任务
简单点说,就是
你现在可能边看这篇文章边听着音乐
而看文章是一个任务(这里的任务指正在做的事情)
听音乐也是一个任务
你同时在做这两件事
就是多任务啦
电脑和人还是不一样的
我们今天讲一下协程来完成多任务(之后还会讲到线程、进程来完成多任务)
考虑一个工厂流水线
A机器每次将一件货物放入箱子
B机器每次将A机器的箱子封箱打包
为了不产生问题,必须A完成一个,B接着完成一个
并且看起来两个任务是同时执行的!
在Python中可以用生成器实现简单的协程:
我们来看这个程序,先定义了两个生成器(不是函数哦~原因在之前课程讲过)
当我们在while主程序中,先使用f1.__next__( )调用生成器func1,因为fun1的循环条件始终为真
所以先打印(执行装入操作)然后遇到 yield 退出生成器func1,回到主程序
接着执行f2.__next__( )调用生成器func2,像之前调用func1一样,先打印(执行打包操作)
然后遇到yield退出生成器func2,回到主程序
因为主程序循环条件始终为真,所以继续像之前一样,接着使用f1.__next__( )调用生成器func1。。。
如此往复。。。
我是使用打断来停止程序执行的,不然会不断执行下去
由于两个生成器(任务)交替执行,很快
就像在多任务执行
所以,通俗理解看上去同时执行的就是多任务~
小明:竟然有这种操作!
今天作业:
敲一遍代码,理解一下两种生成器创建方式
自己不敲代码永远学不会写代码
下课
人生苦短,我选Python
未完待续,连载中......
欢迎评论指出文中错误和提问~~~
小编的免费Python入门课程已经登场,等你来撩~
已经2400+小伙伴加入学习啦~
点击阅读原文,立即学习
Python爱好者社区历史文章大合集:
Python爱好者社区历史文章列表(每周append更新一次)
关注后在公众号内回复“课程”即可获取:
小编的Python入门视频课程!!!
崔老师爬虫实战案例免费学习视频。
丘老师数据科学入门指导免费学习视频。
陈老师数据分析报告制作免费学习视频。
玩转大数据分析!Spark2.X+Python 精华实战课程免费学习视频。
丘老师Python网络爬虫实战免费学习视频。