yield函数的执行顺序
例子:

上图中标明了 行号出现的顺序
从顺序中可以看到
1.开始先执行for循环,执行到93行yield_test(1)时,会调用函数yield_test(),所以打印了79行内容
2.到80行时,遇到了yield,yield可以理解为return,所以93行yield_test(1)得到返回值0
3.接着开始执行94-96行代码
4.当再一次执行93行(for循环)时,从上图顺序中可以看到,程序执行了81-83行。因为n是1,所以这边程序也就停止执行了。
执行结果

从上面的结果中可以看到,yield函数被再次调用时,并不是从函数第一行代码开始执行,而是从yield语句后面一行开始的。
把上面例子中n改成3
def yield_test(n):
for i in range(n):
print(str(sys._getframe().f_lineno) + " before.")
yield call(i)
print(str(sys._getframe().f_lineno) + " after.")
print('i====', i) # 输出的是当前的i值
print(str(sys._getframe().f_lineno) + " afterPrint.") def call(i):
return i * 2 #print(yield_test(4)) # <generator object yield_test at 0x0000000001DE9200> for i in yield_test(3):
print(str(sys._getframe().f_lineno) + " forb.")
print('i=', i) # 输出的是yield函数的返回值 yield函数,相当于一个return语句:下次迭代时候,代码从yield的下一个语句开始执行
print(str(sys._getframe().f_lineno) + " fora.")
结果:可以看到下面结果,yield后面语句执行完成后,才继续从yield函数的第一行继续执行。 yield可以看做return,但是return后面语句将不再执行,而yield在下一次执行时,会将yield后面语句先执行完成。
79 before.
94 forb.
i= 0
96 fora.
81 after.
i==== 0
83 afterPrint.
79 before.
94 forb.
i= 2
96 fora.
81 after.
i==== 1
83 afterPrint.
79 before.
94 forb.
i= 4
96 fora.
81 after.
i==== 2
83 afterPrint.
参考:
https://blog.csdn.net/mieleizhi0522/article/details/82142856
https://blog.csdn.net/wxyangid/article/details/79514040
yield函数的执行顺序的更多相关文章
- unity3D技术之事件函数的执行顺序[转]
unity3D技术之事件函数的执行顺序 转自http://www.yxkfw.com/?p=13703 在unity的脚本,有大量的脚本执行按照预先确定的顺序执行的事件函数.此执行顺序说明如下: ...
- Tip8:Unity中诸如 Awake() Start() Update()等函数的 执行顺序
Unity脚本中有很多的事件函数,下面是各种函数的执行顺序: 1.reset(); 2.Awake(); 3.OnEnable; 4.OnLevelWasLoaded(); 5.Start(); 6. ...
- Unity3D中默认函数的执行顺序
直接用一张图来说明各个默认函数的执行顺序: FixedUpdate以固定的物理时间间隔被调用,不受游戏帧率影响.一个游戏帧可能会调用多次FixedUpdate.比如处理Rigidbody的时候最好用F ...
- vue父子组件钩子函数的执行顺序
加载渲染过程 父beforeCreate->父created->父beforeMount->子beforeCreate->子created->子beforeMount-& ...
- Unity3D中自带事件函数的执行顺序(转)
原文:http://www.jianshu.com/p/1d93ece664e2 在Unity3D脚本中,有几个Unity3D自带的事件函数按照预定的顺序执行作为脚本执行.其执行顺序如下: 编辑器(E ...
- Unity3D事件函数的执行顺序 - 包含渲染等模块的完整版,中英文对照
原文地址: http://www.cnblogs.com/ysdyaoguai/p/3746828.html In Unity scripting, there are a number of eve ...
- Unity3D中自带事件函数的执行顺序
在Unity3D脚本中,有几个Unity3D自带的事件函数按照预定的顺序执行作为脚本执行.其执行顺序如下: 编辑器(Editor) Reset:Reset函数被调用来初始化脚本属性当脚本第一次被附到对 ...
- Unity3D事件函数的执行顺序
In Unity scripting, there are a number of event functions that get executed in a predetermined order ...
- 多个$(document).ready()函数的执行顺序问题,(未解决)
今天遇到了一个问题: jQuery获取不了动态添加的元素,我使用的是append添加的.寻求了帮助,得到解决方案: 在文件开头写上这样一段代码来获取,写在$(document).ready()里面. ...
随机推荐
- gnome-tweak-tool设置gnome参数, 修改CENTOS7桌面图标大小
GNOME Tweak Tool 是 GNOME 3 的优化配置工具,为我们带来 GNOME Shell 扩展安装功能,方便Linux用户对 Gnome Shell 进行一些调整. 主要功能有:安装, ...
- FreeMarker 自定义 TemplateDirectiveModel(一)
FreeMarker 是一个用 Java 语言编写的模板引擎,它基于模板来生成文本输出.FreeMarker 与 Web 容器无关,即在 Web 运行时,它并不知道 Servlet 或 HTTP.它不 ...
- maven错误:is duplicated in the reactor
code-instrument-java git:(masterv2-2.2.2-solr) ✗ mvn clean package -Dmaven.test.skip=true [INFO] Sca ...
- 前端之CSS初识
figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...
- 【bzoj 4671】 异或图
题目 神仙题啊神仙题 显然这个东西一脸不可求的样子啊,这种东西我们显然需要搞一个容斥什么的 于是设\(g_i\)表示至少存在\(i\)个联通块(联通块内部的边没有要求,联通块和联通块之间不存在边)的方 ...
- Quota- Linux必学的60个命令
1.作用 quota命令用来显示磁盘使用情况和限制情况,使用权限超级用户. 2.格式 quota [-g][-u][-v][-p] 用户名 组名 3.参数 -g:显示用户所在组的磁盘使用限制. -u: ...
- ssh 免密码登入
1.普通免密码登入 (1) 生成秘钥 [root@vick ~]# ssh-keygen -t rsa Generating public/private rsa key pair. Enter f ...
- https://blog.csdn.net/u012235003/article/details/54576737
https://blog.csdn.net/u012235003/article/details/54576737
- MyBatis配置文件(一)――properties属性
MyBatis配置文件中有很多配置项,这些配置项分别代表什么,有什么作用,需要理一下了.先通过下面这个例子来看都有哪些配置项 <?xml version="1.0" enco ...
- Composer安装Yii2以及相关扩展
1.安装redis扩展 命令:composer require yiisoft/yii2-redis Git地址:https://github.com/yiisoft/yii2-redis/blob/ ...