携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第7天,点击查看活动详情
0 环境
- 编辑器:idea或vscode
- 系统版本:windows10
- python版本:3.9.6
1 前言
之前的一步步debug,发现生成器的运行方式,并且描述了它的想像,现在归纳一下特点。
2 特点/规律
有四条规则/特点,如下:
- 生成器函数执行时,并不会执行函数体(注意哈,这里说的不是生成器执行的时候,而是执行生成器函数的时候)
- 当使用next方法的时候,当前代码向下执行,当遇到第一个yield关键字的时候,它会出值,并会暂停函数。
- 当再次执行next方法的时候,会从上次暂停的地方开始往下执行。如下图:
执行第二个next方法时。
是不是就验证了,从上次暂停的位置开始往下执行。
- 当yield已经全部被执行完成了,再次执行yield的时候,会有
StopIteration
的报错信息,但是该函数有返回值的情况的话,函数的返回当作异常的value,也就是这种的StopIteration 3(函数的返回值)
。如下图:
3 总结
来个不恰当的比喻,比如我制定了计划,这个计划表内呢,有yield 早上散步,yield 晚上跑步,明天开始执行(第二天计划表生效),当第二天的6点钟的闹钟响起(执行第一个next方法),立马执行计划表里的任务,当早上的散步结束,开始回来了(第一个yield结束了),计划表停在早上散步这格了,你在为自己打气,好好休息,晚上还要跑步,一定要努力减肥呢,当晚上的7点的钟声响起时(执行next方法),你不得不立马爬起来,执行计划表下一个任务,直到跑步结束后,计划表停在晚上跑步这格了,这时计划表里么有yield任务了。还有两种情况,不过再往下反转就可能是个减肥失败的故事了,自行脑补。