函数调用过程&生成器解释
摘自马哥解答,感谢.
函数调用过程:
假设程序是单进程,单执行流,在某一时刻,能运行的程序流只能有一个。但函数调用会打开新的执行上下文,因此,为了确保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)
函数调用过程&生成器解释的更多相关文章
- 从一个新手容易混淆的例子简单分析C语言中函数调用过程
某天,王尼玛写了段C程序: #include <stdio.h> void input() { int i; ]; ; i < ; i++) { array[i] = i; } } ...
- C++函数调用过程深入分析<转>
转自http://blog.csdn.net/dongtingzhizi/article/details/6680050 C++函数调用过程深入分析 作者:靠谱哥 微博:洞庭之子-Bing 0. 引言 ...
- c函数调用过程原理及函数栈帧分析
转载自地址:http://blog.csdn.net/zsy2020314/article/details/9429707 今天突然想分析一下函数在相互调用过程中栈帧的变化,还是想尽量以比 ...
- Linux驱动调试-根据oops的栈信息,确定函数调用过程
上章链接入口: http://www.cnblogs.com/lifexy/p/8006748.html 在上章里,我们分析了oops的PC值在哪个函数出错的,那如何通过栈信息来查看出错函数的整个调用 ...
- C语言的函数调用过程
从汇编的角度解析函数调用过程 看看下面这个简单函数的调用过程: int Add(int x,int y) { ; sum = x + y; return sum; } int main () { ; ...
- 37.Linux驱动调试-根据oops的栈信息,确定函数调用过程
上章链接入口: http://www.cnblogs.com/lifexy/p/8006748.html 在上章里,我们分析了oops的PC值在哪个函数出错的 本章便通过栈信息来分析函数调用过程 1. ...
- 深入理解C语言的函数调用过程 【转】
转自:http://blog.chinaunix.net/uid-25909619-id-4240084.html 原文地址:深入理解C语言的函数调用过程 作者:wjlkoorey258 本文 ...
- C语言的函数调用过程(栈帧的创建与销毁)
从汇编的角度解析函数调用过程 看看下面这个简单函数的调用过程: int Add(int x,int y) { ; sum = x + y; return sum; } int main () { ; ...
- 模式识别 - libsvm的函数调用方法 具体解释
libsvm的函数调用方法 具体解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26261173 须要载入(load)SVM的 ...
随机推荐
- block、inline、inline-block对比
display:block 1.block元素会独占一行,多个block元素会各种新起一行.默认情况下,block元素宽度自动填满其父元素容器: 2.block元素可以设置width和height属性 ...
- C# 添加、获取及删除PDF附件
C# 添加.获取及删除PDF附件 前言 附件在PDF文档中很常见,这些附件可以是PDF或其他类型的文件.在PDF中,附件有两种存在方式,一种是普通的文件附件(document-level file a ...
- hadoop2.5.2安装部署
0x00 说明 此处已经省略基本配置步骤参考Hadoop1.0.3环境搭建流程,省略主要步骤有: 建立一般用户 关闭防火墙和SELinux 网络配置 0x01 配置master免密钥登录slave 生 ...
- [Selenium With C#学习笔记] Lesson-01环境搭建
Step-1:准备所需的开发环境.浏览器驱动.Selenium-Webdriver.单元测试框架,因目前使用C#的开发神器都Visual Studio,本文也打算采用Visual Studio 201 ...
- 不要怂,就是GAN (生成式对抗网络) (六):Wasserstein GAN(WGAN) TensorFlow 代码
先来梳理一下我们之前所写的代码,原始的生成对抗网络,所要优化的目标函数为: 此目标函数可以分为两部分来看: ①固定生成器 G,优化判别器 D, 则上式可以写成如下形式: 可以转化为最小化形式: 我们编 ...
- Bat再次小试
继<Bat小试牛刀>之后,今天又需要一个小的bat文件.需求是这样的,有一个windows服务(服务名:xxxx,进程映像名:xxxx.exe)被数据库拖慢了,但目前又没时间调整代码,所以 ...
- mysql数据库的中文乱码问题的解决
今天终于解决了数据库中文乱码的问题,分享出来让更多的人作为参考,我们进入主题: 如果在搭建mysql数据库的时候没有设置它的编码格式,在以后的开发中,中文乱码会是一个令人头疼的问题,所以我在这里分享一 ...
- gulp自动化压缩合并、加版本号解决方案
虽然网上有很多的 gulp 构建文章,但是很多都已经随着 gulp 插件的更新无法运行了.因此,我写了这个比较简单的构建方案. 如果还不熟悉 gulp 的插件,可以阅读上一篇文章:精通gulp常用插件 ...
- 【js】基本类型和引用类型的区别
1.保存方式:(一脸懵逼???) 基本类型是按值访问的,可以在变量的生命周期改变它,但是它是储存在哪里的呢?在浏览器缓存吗?[执行环境中定义的所有变量和函数都存储在执行环境的变量对象里,变量对象我们编 ...
- Java面试04|Spring框架
1.动态代理的几种方式 Java主要有两种代理,JDK和Cglib动态代理.先看JDK代理实例如下: JDK创建代理有一个限制,即它只能为接口创建代理实例.举个例子如下: public interfa ...