11 函数

作者: xncode | 来源:发表于2017-05-01 18:02 被阅读3次

函数,是一个动态的过程,在函数被调用时,系统会动态创建一个栈帧,函数对应的表示结构:

    typedef struct {
    PyObject_HEAD
    PyObject *func_code;    /* A code object */
    PyObject *func_globals; /* 函数运行时的global名称空间 */
    PyObject *func_defaults;    /* 函数默认参数 NULL or a tuple */
    PyObject *func_closure; // 用于实现闭包的
    PyObject *func_doc;     /* The __doc__ attribute, can be anything */
    PyObject *func_name;    /* The __name__ attribute, a string object */
    PyObject *func_dict;    /* The __dict__ attribute, a dict or NULL */
    PyObject *func_weakreflist; /* List of weak references */
    PyObject *func_module;  /* The __module__ attribute, can be anything */
    } PyFunctionObject;

函数内包含的func_code则对应的是函数的代码,静态的、在编译时就定义好了,而函数则是在运行时,即运行到def语句时构建(func_globals是在这时候才能确定的)

所以,一段代码肯定对应一个code object,但是函数对象可能有多个,例如多次调用该函数,会构建多个func object,这些func object的func_code都指向一个code object。

函数对象的创建

注意,Python在执行到def语句后,接着执行其后的代码,而不是进入到函数体内执行其中的语句(这些语句是在编译时就已经构建好了对应的code object),函数的声明和实现时分离的,分在了不同的code object中。

def语句

对应的机器码有三条:

load_const 0

装载编译好的函数体的code object

make_function

构建函数对象

store_name 0

把构建好的函数对象添加到名称空间内

make_function

pop

把之前装载的函数体的code object取出来

PyFunction_New(v, f->f_globals)

主要是分配函数对象的空间,给函数对象中的func_code, func_globals等赋值。

push

把创建好的函数对象压入运行时栈中,最后通过store_name添加。

函数调用

f()

对应的机器码五条:

load_name 0

获取该函数对象

call_function 0

调用

pop_top
load_const
return_value

返回值

相关文章

  • C++学习笔记(十七) - Lambda函数

    参考文献:C++11新特性:Lambda函数(匿名函数)匿名函数,C++11里面加入了匿名函数。 1 定义一个基本...

  • 2019-11-14逻辑函数(IF、and 、OR)

    Day 11逻辑函数(IF、and 、OR) 逻辑函数先了解TRUE(真)成立 FALSE(假)不成立 逻辑函数 ...

  • 11 函数

    函数,是一个动态的过程,在函数被调用时,系统会动态创建一个栈帧,函数对应的表示结构: 函数内包含的func_cod...

  • 11 - 函数

    1 . 函数的概念 如果在开发程序时,某块代码需要多次调用或者复用性高,为了提高编写的效率以及代码的重用,把具有独...

  • 2019-04-07 认识函数

    今天我们来认识下函数 ,Excel函数则是Excel中的内置函数。 Excel函数共包含11类,分别是数据库函数、...

  • 求和升级

    求和函数(SUMIF SUMIFS函数) 11月29日 一- 基本用法 SUMIF 函数结构=(判断区域 、求和的...

  • LearningR-math

    1. integrate函数 2. 举例 2.1 分段函数求积分 分段函数的参数有11组,在每组参数下求出分段函数...

  • APUE读书笔记-04文件和目录(3)

    11、 chown , fchown ,和 lchown 函数 chown 函数允许我们修改文件的 User-ID...

  • AutoLisp中常见的函数(3)

    11. 判断式、循环相关函数 12. 函数处理、定义、追踪和错误处理函数 13. 显示、打印控制函数 14. 符号...

  • 2019-01-07

    Day11 一、 递归 1、 什么是递归函数 在函数体内调用函数本身的函数就是递归函数实际开发的时候,能不用就不用...

网友评论

    本文标题:11 函数

    本文链接:https://www.haomeiwen.com/subject/znqttxtx.html