函数进阶
一、命名空间和作用域
1、命名空间
本质:存放名字与值的绑定关系。
加内置命名空间(程序运行前加载)->全局命名空间(程序运行中:从上到下加载)->局部命名空间(程序运行中:调用时才加载)载顺序:
(1)全局命名空间
打开文件是运行
(2)内置命名空间
Python程序启动时运行
(3)局部命名空间
程序内部运行
(4)局部调用
局部命名空间->全局命名空间->内置命名空间
2、作用域
(1)作用
为了函数内的变量不影响到全局
(2)全局作用域
全局命名空间、内置命名空间
(3)局部作用域
局部命名空间
(4)特点
1、小范围的可以使用大范围的,但是大范围的不能使用小范围的。
2、小范围类使用变量,优先使用自身的变量,如果没有就使用上一层的,上一层没有就继续向上一层找,以此类推,如果都没有,报错。
二、作用域链与函数嵌套
定义:一个函数中运行到包含在函数中的另一个函数,它们之间形成域链。
(1)nolocal关键字
1、外部必须有这个变量。
2、内部函数在声明nolocal变量之前不能有同名变量。
3、内部修改这个变量在外部有这个变量的第一层有效
三、函数名的本质
本质:函数的内存地址
作用:(1)可以被引用
(2)可以作为参数的参数和返回值
(3)可以作为容器类元素
闭包:
闭:内部函数
包:包含了对外部作用域变量的引用
闭包函数:内部函数,包含了对外部作用域变量的引用。
闭包函数的应用
1、装饰器:
目的:不改变函数的调用方式,也不修改原代码的情况下,对函数进行扩展。
原则:开放封闭原则。
即对扩展是开放的,对修改是封闭的。
装饰器的万能模板
def wrapper(func): def inner(*args,**kwargs): ret=func(*args,**kwargs) return ret return inner @wrapper def haha(): print('hello world!') haha()
2、带参数的装饰器
F=True #装饰器开关 def outer(flag): #传参 def f(func): #装饰器 def inner(*args,**kwargs): #动态传参 if flag: #判断条件 print('before') ret=func(*args,**kwargs) #将调用函数的返回值赋值给ret print('after') else: ret=func(*args,**kwargs) #将调用函数的返回值赋值给ret return ret #将调用函数的返回值赋值给inner函数 return inner #将inner返回给调用函数 return f #将装饰器函数的返回给outer函数 @outer(F) #装饰器开关 def xhp(): #被装饰的函数 print('思密达!')
3、多个装饰器装饰一个函数
def a(func): def inner(*args,**kwargs): print('in a:before') ret=func(*args,**kwargs) print('in a:after') return ret return inner def b(func): def inner(*args,**kwargs): print('in b:before') ret=func(*args,**kwargs) print('in b:after') return ret return inner @a @b def c(): print('思密达!') c()
终于完了,OK!