1.1 函数嵌套定义
在一个函数内又定义了另外一个函数
def f1():
def f2():
f1()
res = f1()
print(res)
1.2 函数嵌套调用
在调用一个函数的过程中又调用了其他函数
def max2(x, y):
if x > y:
return x
def max4(a, b, c):
res1 = max2(a, b)
res2 = max2(res1, c)
return res3
2.1 名称空间
就是存放名字的地方
2.1.1 内置名称空间
存放的是python解释器自带的名字,如len、print、input
生命周期:解释器启动则创建,解释器关闭就销毁
2.1.2 全局名称空间
内置以及函数内的名字之外的名字都存放于全局名称空间中
生命周期:运行顶级代码/主流水线则创建,顶级代码/主流水线结束则销毁
2.1.3 局部名称空间
函数内的名字
生命周期:函数调用时则创建,函数调用完毕则立即销毁
2.2 名称空间名字的查找顺序
基于当前所在的位置向上查找
局部->外层套的局部->外层套的局部->....->全局->内置
强调:名称空间的"嵌套关系"是函数定义阶段、也就是检测语法的时候就确定的,与调用为无关
2.3 作用域
2.3.1 全局作用域
内置名称空间、全局名称空间
全局存活、全局有效
2.3.2 局部作用域
局部名称空间
临时存活,局部有效
2.4 函数的参数传递都是值拷贝
2.4.1 对全局定义的不可变类型,在函数内不能直接修改
x = 10
def func(a): # a=10的内存地址
a = 123
func(x) # x=10的内存地址
2.4.2 对全局定义的可变类型,可以在函数内直接修改
x = []
def func(a): # a=列表的内存地址
2.4.3 global可以在函数内修改全局的不可变类型
x = 10
def func():
global x
x = 666
2.4.4 nonlocal可以修改外层的不可变类型
3.1 闭包函数
闭:指的是定义函数内的函数
包:指的内函数引用了外函数的变量
def outter():
def inner():
return inner # 千万不要加括号
3.2 为函数体代码传参的方式有两种
1.直接通过参数的方式传入
2.通过闭包函数传参
def outter(x):
def func():
print(x)
return func # 一定不要加括号
f1 = outter(1)
f1()
2020 python学习第十三天————函数嵌套,名称空间与作用域和闭包函数
原文:https://www.cnblogs.com/shof/p/13153958.html