zoukankan      html  css  js  c++  java
  • 函数调用过程&生成器解释

    摘自马哥解答,感谢.

    函数调用过程:

      假设程序是单进程,单执行流,在某一时刻,能运行的程序流只能有一个。但函数调用会打开新的执行上下文,因此,为了确保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会暂停,即保存现场。

      于是,下一次调用这个函数,是从上一次保存的状态继续进行,而非从头。

    实例:

     1 #!/usr/bin/env python
     2 # Date: 2016/02/27
     3 #
     4 
     5 def fn(x):
     6     ret = 1
     7     for i in range(1, x+1):
     8         ret *= i
     9         yield ret
    10 
    11 for x in fn(5):
    12     print(x)
    13     print('-'*20)
    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。 http://www.cnblogs.com/topicjie/
  • 相关阅读:
    nvm安装node的问题
    前端必读:浏览器内部工作原理
    读书笔记:《高性能网站建设指南》
    学习前端我读过的书
    Canvas绘制圆形进度条
    gitlab升级方法
    设置root远程连接ubuntu上mysql
    SpringMVC的@ResponseBody返回JSON,中文乱码问题的解决.
    JSTL 格式化输出 Calendar
    在Maven的配置文件中,自定义私有仓库地址和设置下载的jar包的保存位置
  • 原文地址:https://www.cnblogs.com/topicjie/p/5223664.html
Copyright © 2011-2022 走看看