Python函数机制
Python函数机制
函数的创建
def f():
print(f"function f run")
g()
f() # [1]
def g():
print(f"function g run")
f() # [2]
函数的执行
Python程序的执行过程
经常看见说 Python是一门解释性语言,没有编译的过程。实际上Python也有编译过程,只不过编译的结果是字节码文件。
python test.py执行之后会发生什么?先是.dll把源码转成.pyc文件(这个.pyc实际上就是字节码存储体现,有些情况下也可能不会生成pyc文件,直接在内存中以PyCodeObject的形式存在),这个过程就是Python的编译过程,然后.dll再顺序执行字节码。dll包含了编译器和虚拟机。
这里提一下pyc文件。正常来说,python test.py肯定是先词法语法分析之类的,然后把源码组织成内存中的对象,这个对象的类型就是PyCodeObject。pyc就是硬盘中的PyCodeObject。
Python 会根据 pyc 中记录的编译结果直接建立内存中的 PyCodeObject 对象,而不用再次对源文件进行 编译了。
对于一段
Python
代码,其对应的
PyCodeObject
对象只有一个,而代码所对应的
PyFunctionObject
对象却可能有很多个,比如一个函数多次调用,则
Python
会在运行时
创建多个
PyFunctionObject
对象,每一个
PyFunctionObject
对象的
func_code
域都会
关联到这个
PyCodeObject
对象。
无参函数
函数函数执行定义与
流程图
有参函数
位置参数和kwargs
默认参数的坑
闭包
例子
a = 1
def outer_func():
a = 10
def inner_func():
print(a)
return inner_func
f = outer_func()
f()
这个大家都知道因为闭包的原因,输出是10。但实际上按照直觉来说,inner_func调用的时候已经跳出了outer_func的作用域,a应该是1,为什么a的值还是能被a = 10约束住。闭包在这里是怎么起作用的?
简单地说,闭包是函数+约束。这个约束主要指闭包作用域closure。
outer_func返回的是不仅仅是inner_func,还有a = 10这个外部的变量这条约束,Python将这两个作为一个整体返回,这个约束就是func_closure。
Python 闭包原理_python闭包原理-CSDN博客
闭包流程图
几个闭包的典型错误分析
装饰器
lambda函数
热更新
什么是热更新