一、装饰器
一)装饰器的知识储备
不想修改函数的调用方式,但是还想在原来的函数前后添加功能
1、可变长参数 :*args和**kwargs
1 def index(name,age): 2 print(name,age) 3 4 def wrapper(*args,**kwargs): 5 #即args=(1,2,3,4,5),kwargs={'x':1,'y':3} 6 index(*args,**kwargs) 7 #index(1,2,3,4,5,y=2,x=5)
2、函数对象:被当做数据传递
1、函数可以当做参数传给另外一个函数 2、一个函数的返回值,也可以是一个函数(打破函数的层级关系) def f1(): def f2(): print('f2') return f2 ##打破函数的层级关系 f=f1() f()
3、名称空间和作用域
1、名称空间: 分类:分三种 内置名称空间:Python解释器启动则生效,关闭时失效 全局名称空间:执行Python文件时生效 内置名称空间:调用函数时,临时生效;函数调用结束失效 加载顺序:先内置,在全局,最后有可能产生局部 查找名字的顺序:先局部,再全局,最后内置 2、作用域 分类:分两种 全局作用域:全局存活,全局有效 局部作用域:临时存活,局部有效 强调:作用关系在函数定义阶段已经固定,与调用位置无关
二)闭包函数
1、定义
1、定义在函数内部的函数 2、包含对外部作用域名字的引用,而不是对全局作用域名字的引用 那么该内部函数称之为闭包函数
2、实例
1 x = 1 2 def f1(): 3 x=111111111111 4 def f2(): #f2是闭关函数 5 print(x) 6 return f2 ##获取返回值 7 func=f1() 8 # func() 9 10 def foo(): 11 x=1988193190112131 12 func() 13 foo()