函数调用过程&生成器解释
2016-02-27 21:49
274 查看
摘自马哥解答,感谢.
函数调用过程:
假设程序是单进程,单执行流,在某一时刻,能运行的程序流只能有一个。但函数调用会打开新的执行上下文,因此,为了确保main函数可以恢复现场,在main函数调用其它函数时,需要先把main现场保存下来,放一边,即栈中。这时候,被调用函数即可执行,且完成后,可加到调用者Main。“回到”调用者main,main就可以继续向后运行。函数调用可嵌套运行,例如,X --> Y --> Z, 在Z返回后,Y方可继续,并直到返回,接着X才能继续, 并直到结束。此场景中,X先入栈,接着是Y;于是,Z返回,Y出栈;Y返回,X出栈;
生成器:
当调用有yield语句的函数的时候,函数内部的代码并不立即执行 ,而是只返回一个生成器对象。每个函数的生命周期是从被调用开始,到返回结束,下一次再进入此函数就得重新开始。但一添加yield就并非如此了,每次遇到yield,它会返回一个值给调用者,而后当前函数就暂停了(而非退出),接着把控制权交还给调用者。
yield就相当于return,只不过,return而结束当前函数,但yield会暂停,即保存现场。
于是,下一次调用这个函数,是从上一次保存的状态继续进行,而非从头。
实例:
#!/usr/bin/env python # Date: 2016/02/27 # def fn(x): ret = 1 for i in range(1, x+1): ret *= i yield ret for x in fn(5): print(x) print('-'*20)
相关文章推荐
- oracle merge into 语法
- 【Android】14.0 第14章 内部存储与外部SD卡存储—本章示例主界面
- 自定义view相关学习
- Linux Is Not Matrix——使用域名访问局域网网站
- 2016,新的开始
- HLS+CDN巧妙的串流技術組合
- Uniform Generator
- linux(ubuntu)mysql自动安装
- asp.net中<%@ Page Language....的意思
- 我的Android进阶之旅------>关于android:layout_weight属性的详细解析
- Benchmark库的建立05:任务Post失败 Bug
- 真正的问题不在于长大,而在于遗忘。
- android应用Dialog跳转到Activity
- C#综合揭秘——细说多线程(下)
- varnish 配置文件分享(sens杨 注释)
- Redis安装部署
- 编程知识汇总--转载
- Windows Server 2008 R2 负载平衡入门篇
- java default使用
- bzoj 1001: [BeiJing2006]狼抓兔子