python全栈闯关--10-2、函数的嵌套和作用域
1、全局作用域函数嵌套
def three_max(a, b, c): t = two_max(a, b) # 函数嵌套调用two_max return t if t > c else c def two_max(a, b): return a if a > b else b print(three_max(1, 2, 3))
程序执行,按照从下往下的顺序,把变量、函数名加入到命名空间,如果还未加入到命名空间,就调用了函数,将会报错。
如上程序,如果把three_max的调用,交换到two_max的前面,将会报错:NameError: name 'two_max' is not defined
def three_max(a, b, c): t = two_max(a, b) # 函数嵌套调用two_max return t if t > c else c print(three_max(1, 2, 3)) # NameError: name 'two_max' is not defined def two_max(a, b): return a if a > b else b
2、内部函数使用外部函数
a = 1 def outer(): a = 1 def inner(): a = 2 def inner2(): a = 3 print("inner2:", a) # 3 inner2() print("inner:", a) # 2 inner() print("outer:", a) # 1 outer() print(a)
嵌套定义时,每个局部都有自己的命名空间,互相不干扰
子函数定义了和父函数相同的变量,其值都为独立的,修改不影响父函数
global
a = 1 def outer(): a = 1 def inner(): a = 2 def inner2(): global a # 修改的是全局的变量数据 a = 3 print("inner2:", a) # 3 inner2() print("inner:", a) # 2 inner() print("outer:", a) # 1 outer() print(a) # 3
global定义的变量,是全局命名空间的变量
不影响局部的变量
nonlocal
a = 1 def outer(): # nonlocal a # 只能对局部作用域变量有效,在最后一个局部报错SyntaxError: no binding for nonlocal 'a' found a = 1 def inner(): # nonlocal a a = 2 def inner2(): nonlocal a a = 3 print("inner2:",a) # 3 inner2() print("inner:", a) # 3 nonlocal找到上一层的变量进行了更改 inner() print("outer:", a) # 1 outer() print(a) # 定义nonlocal后,全局变量不变依然为1
nonlocal寻找离当前函数最近的一层局部变量
声明了nonlocal的局部变量的改动,会影响最近一层的函数的局部变量
3、函数名总结
1、函数名就是函数的内存地址,可以直接赋值;
2、函数名可以作为容器的元素;
3、函数名可以作为参数;
4、函数名可以作为返回值;
def func(): print(123) # 函数名就是函数地址,可以直接赋值 f1 = func f1() # 函数名可以做为容器的元素 l = [func, f1] for i in l: i() # 函数名可以作为参数 # 函数名可以作为返回值 def func2(f): f() return f # 函数名作为返回值 f2 = func2(func) # 函数名作为参数 f2()