函数对象、名称空间和作用域
一、函数对象
函数的名字就是函数对象,它在python中是第一类对象,函数名指向的是函数的内存地址。
1.1 函数对象的作用:
1、函数名可以被引用
def bar(): print('from bar') f=bar f()
2、函数名可以当作参数传入
def bar(): print('from bar) def wrapper(func): #func=bar func() wrapper(bar)
3、可以当函数的返回值
def bar(): print('from bar') def foo(func): return func #print(bar) f = foo(bar) # f ---> bar #print(f) f()
4、函数名可以作为容器类型的元素
def get(): print('from get') def put(): print('from put') l = [get,put] #print(l) l[0]()
1.2 函数对象的应用
可以优雅地取代if分支
二、函数嵌套
作用:让内层函数封闭起来,不让外部直接调用
2.1 函数的嵌套调用:
在函数内又调用其他函数,将复杂并且小的功能,在函数内部调用,解决代码结构清晰问题
def max1(x,y): if x > y: return x else: return y def max2(x,y,z): res1 = max1(x,y) res2 = max1(res1,z) return res2 print(max2(11,199,2))
2.2 函数的嵌套定义:
例1: def func1(): print('from func1') def func2(): print('from func2') func2() func1()
三、名称空间
名称空间:存放名字与值绑定关系的地方,如果你想访问一个变量值,必须要先访问对应的名称空间
名称空间的分类:
内置名称空间:存放python解释器自带的名字。
在启动python解释器时就生效,关闭就失效
全局名称空间:文件级别(顶头写的名字)的名字。
在执行文件时生效,在文件结束或者在文件执行期间被删除的就失效
def func(): #func是全局的 pass if 10>3: y =333 #y 是全局的
局部名称空间:存放函数内定义的名字(函数的参数以及函数内的名字都存放于局部内存空间)。
在调用当前函数时临时生效,函数体代码执行结束时失效。
加载顺序:内置名称空间 -->>全局名称空间-->>局部名称空间
名称空间的查找顺序:局部名称空间-->>全局名称空间-->>内置名称空间
len = 'global' def f1(): # len = 1 def f2(): # len = 2 print(len) len = 1 f2() f1()
四、作用域
作用域:名称空间发挥作用的范围
作用域的分类:
1、全局作用域:包含的是内置名称空间与全局名称空间的名字
特点: 只要程序一直执行,永久存活,若程序结束,则销毁
2、局部作用域:包含的是局部名称空间的名字
特点:只能在函数内使用,调用函数时生效,调用结束失效
补充:
1、global:声明全局变量
def index(): global x #声明X是全局变量 x=2 print(x) index() print(x)
2、nonlocal:在局部名称空间声明局部变量,在局部修改外部(上层函数)的变量
def index(): x=1 def func(): nonlocal x x=2 func() print(x) index()