Python进阶系列连载(7)——生成器(下)

浏览: 3229

前言

进阶部分连载继续~

如果还没看过我的入门连载部分,先看:

https://ask.hellobi.com/blog/wangdawei/10288


当然,小编的免费入门课程已经有咯,看过连载的朋友可以看看视频再快速梳理一遍~

视频传送门:https://edu.hellobi.com/course/234

图片.png

前文传送门:

Python进阶系列连载(1)——那些容易被忽略的问题(上)

Python进阶系列连载(2)——那些容易被忽略的问题(中)

Python进阶系列连载(3)——那些容易被忽略的问题(下)

Python进阶系列连载(4)——迭代器

Python进阶系列连载(5)——生成器(上)

Python进阶系列连载(6)——生成器(中)


send()退化为next()


上节课说到send()的一个问题:


图片.png


这是为什么呢?


小红:老师,我想了两天终于想到了!


哦?你说说


小红:因为 f.send()取生成器第一个对象,并且传入了一个参数‘Python’

但是,并没有变量去接收这个参数!所以报错了!


是的,之前我们的代码是这样的:


图片.png


注意,我们调用第一个对象使用next,并没有传入参数!

而第二次使用send调用下一个对象时候,传入的参数相当于代替了yield i

也就是赋值给了item,所以没报错


小明:老湿,你说send是加强版的next,我想给send退化到next,可以么?


这个嘛,是可以的!小明你试试!


小明:大家都退后!我要装逼了!


图片.png


图片.png


小明:不传参数竟然不行!!!


图片.png


小明啊,应该是这样的!


图片.png


传入None才对!


小明:我不服!老湿,你说这生成器很厉害,具体有啥应用呢?学了没用岂不是很鸡肋?


这个嘛!其实是有用的,我先剧透一下!


图片.png


图片.png


多任务——协程


我们先介绍一下多任务


多任务处理是指用户可以在同一时间内运行多个应用程序,每个应用程序被称作一个任务


简单点说,就是


你现在可能边看这篇文章边听着音乐


图片.png


而看文章是一个任务(这里的任务指正在做的事情)

听音乐也是一个任务

你同时在做这两件事

就是多任务啦


电脑和人还是不一样的


我们今天讲一下协程来完成多任务(之后还会讲到线程、进程来完成多任务)


考虑一个工厂流水线


A机器每次将一件货物放入箱子

B机器每次将A机器的箱子封箱打包


为了不产生问题,必须A完成一个,B接着完成一个

并且看起来两个任务是同时执行的!


图片.png


在Python中可以用生成器实现简单的协程:


图片.png


我们来看这个程序,先定义了两个生成器(不是函数哦~原因在之前课程讲过)


当我们在while主程序中,先使用f1.__next__( )调用生成器func1,因为fun1的循环条件始终为真

所以先打印(执行装入操作)然后遇到 yield 退出生成器func1,回到主程序

接着执行f2.__next__( )调用生成器func2,像之前调用func1一样,先打印(执行打包操作)

然后遇到yield退出生成器func2,回到主程序

因为主程序循环条件始终为真,所以继续像之前一样,接着使用f1.__next__( )调用生成器func1。。。


如此往复。。。


我是使用打断来停止程序执行的,不然会不断执行下去

由于两个生成器(任务)交替执行,很快

就像在多任务执行


所以,通俗理解看上去同时执行的就是多任务~


小明:竟然有这种操作!


今天作业:

敲一遍代码,理解一下两种生成器创建方式

自己不敲代码永远学不会写代码

下课

人生苦短,我选Python

未完待续,连载中......

欢迎评论指出文中错误和提问~~~


下一章:Python进阶系列连载(8)——闭包(上)

推荐 7
本文由 ID王大伟 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

11 个评论

最近连载比较快了
不好意思,今天听了你的入门课,安装anaconda3.5,环境变量是C:\Users\hp\Anaconda3;C:\Users\hp\Anaconda3\Scripts;但是还是出现conda不是内部命令,找了好多文章也没有用,不知道是不是和我设置了LM_LICENSE_FILE-@localhost;有关?希望能从大神这里得到解决,谢谢!
你是win7么
是win7,安装完模块一个都没有显示,只有一个prompt
进prompt 输入 jupyter notebook 回车
你好,请问我这部分学完后续应该怎么学?
推荐一本书 流畅的python
老师,我出现这个错误是为什么啊。

AttributeError: 'generator' object has no attribute '_next_'
AttributeError Traceback (most recent call last)
<ipython-input-753-a8e6de672539> in <module>()
2 f2 = func2()
3 while 1:
----> 4 f1._next_()
5 f2._next_()

AttributeError: 'generator' object has no attribute '_next_'
双线划线
双线划线

要回复文章请先登录注册