2020-06-17 目录:
一、函数嵌套
1.1 定义
1.2 函数嵌套的调用
二、名称空间与作用域
2.1 名称空间
2.1.1 内置名称空间
2.1.2 全局名称空间
2.1.3 局部名称空间
2.2 名称空间的查找顺序
2.3 作用域
2.4 函数的参数传递
三、闭包函数
3.1 介绍
3.2 函数体代码传参的方式
一、函数嵌套
1.1 定义
在一个函数内又定义了另一个函数 如: def f1(): def f2(): print('from f2') f2() f1()
1.2 函数嵌套的调用
在调用一个函数的过称中又调用了另一个函数 如取四个值的中的最大值: def max2(x, y): if x > y: return x else: return y def max4(a, b, c, d): res1 = max2(a, b) res2 = max2(res1, c) res3 = max2(res2, d) return res3 print(max4(1, 2, 3, 4))
二、名称空间与作用域
2.1 名称空间
名称空间:即内存中存放名字的地方
2.1.1 内置名称空间
存放的是python解释器自带的名字,如:print、int、input等 生命周期:自解释器打开就创建直到关闭,期间一直存在,解释器关闭就清除
2.1.2 全局名称空间
除内置和函数内的名字之外,所有的存放于全局名称空间
生命周期:运行顶级代码(主流水线)则创建,顶级代码(主流水线)结束则清除
2.1.3 局部名称空间
存放函数内定义的名字
生命周期:函数调用时创建,函数调用完毕就立即清除
2.2 名称空间的查找顺序
基于现在的位置向上找。
具体的:局部—>外层套的局部—>外层套的局部—>...—>全局—>内置
示范① :站在全局进行查找
input = 333 def f1(): input = 4444 f1() print(input) # >>>333
示范② :站在局部进行查找
def f1(): input = 444 print(input) input = 333 f1() # >>>444
示范③:
def f1(): print(input) def f2(): input = 555 print(input) input = 333 f1() # >>>333 (f1函数调用前的全局名称都要查找) f2() # >>>555 (优先查找当前局部位置)
示范④:
def f1(): input = 444 # 查找优先级第二 def inner(): input = 555 # 查找优先级第一 print(input) inner() input = 333 # 查找优先级第三 f1() # >>>555
ps:名称空间的嵌套关系是函数定义阶段(检测语法的时候)就已经确定好的,与调用无关
示范⑤ :
x = 111 def f1(): print(x) def f2(): x = 222 f1() f2() # >>>111
2.3 作用域
① 全局作用域:内置名称空间、全局名称空间
特点:全局存活、全局有效
② 局部作用域:局部名称空间
特点:临时存活,局部有效
2.4 函数的参数传递
① 对全局定义的不可变类型,不可以在函数内直接修改 x = 10 def func(a): # a=10的内存地址 a = 123 # 123的存地址绑定给a func(x) # x=10的内存地址 print(x) # >>>10 ② 对全局定义的可变类型,可以在函数内直接修改 x = [] def func(a): # a=列表的内存地址 a.append(1111) func(x) # x=列表的内存地址 print(x) #>>>[1111] ③ 在函数中修改全局的不可变类型 x = 10 def func(): global x x = 666 func() print(x) #>>> 666 ④ nonlocal(了解) x = 10 def f1(): x = 11 def f2(): nonlocal x x = 666 f2() print(x) f1() # >>>666 print(x) # >>>10
三、闭包函数
3.1 介绍
闭包函数=》函数对象+函数嵌套定义+名称空间与作用域 闭:是指定义函数内的函数 包:是指内函数引用了外函数的变量 作用:可以将内部的函数打破层级的限制,返回到全局来使用 def outter(): x = 1111 def inner(): print(x) return inner # 不要加括号 f = outter() # f=inner print(f) # >>> <function outter.<locals>.inner at 0x0000019A2114A4C0> def f3(): x = 222222 f() f3() # >>>1111
3.2 函数体代码传参的方式
方式一:直接通过参数的方式传入
def func(x): print(x) func(1) func(2)
方式二:用闭包函数
def outter(x): def func(): print(x) return func # 一定不要加括号 f1 = outter(111) f2 = outter(222) f3 = outter(333) f1() # >>>111 f2() # >>>222 f3() # >>>333