函数和装饰器
1、名称空间,作用域,取值顺序等
名称空间:当执行函数的时候,他会在内存中开辟一个临时名称空间,存放函数体内的所有变量与值的关系,随着函数的执行完毕,临时空间自动关闭。<br />作用域:是程序在执行过程中变量与值得起作用范围<br />取值顺序:对于变量和值最先起作用是函数内,然后是全局,最后是内置
2、函数的嵌套
在程序执行中,开始只会把函数名放到内存中 ,函数在调用的时候才执行。
代码从上至下依次执行, 调用函数:函数里面从上至下依次执行。
3、内置函数global(),nonlocal()
print(globals()) # 全局名称空间:所有变量
print(locals()) # 局部名称空间:所有变量
a =
b =
def func1():
c =
d =
print(globals()) # 全局变量放在一个字典中
return locals() # {'c': , 'd': }
print(func1())4、关键字global,nonlocal
global:在局部空间内改变一个全局变量
nonlocal:在局部作用域中,对父级作用域(或者更外层作用域非全局作用域)的变量进行引用和修改,并且引用的哪层,从那层及以下此变量全部发生改变。
5、函数名的应用
函数名是函数的名字,本质:变量,特殊的变量。
5.1、单独打印函数名
def func1():
print()
print(func1) # <function func1 at 0x0000000000872378>
a =
print(a)5.2、函数名的赋值
def func2():
print()
f = func2
print(f())5.3、函数名可以作为容器类数据的元素
l1 = []
for i in range(1,5):
l1.append('f'+str(i))
print(l1)5.4函数名可以作为参数
a =
def f1(x):
print(x)
f1(a)5.5、函数名可以作为函数的返回值。
def wraaper():
def inner():
print()
inner()
wraaper()6、闭包
闭包:就是内层函数对外层函数(非全局)变量的引用。
如何判断 内层函数名.__closure__ cell 就是=闭包
name = '老男孩'
def wraaper2(n):
# n = '老男孩' 相当于
def inner():
print(n)
inner()
print(inner.__clo7、装饰器初识
7.1测是一个函数执行时间(直接加函数中)
def func1():
print('你有病呀,领导,测试我的执行效率干甚。')
print(time.time()) # 时间戳
start_time = time.time()
func1()
time.sleep(0.3)
end_time = time.time()
print('此函数的执行效率%s' % (end_time - start_time))7.2测是一个函数执行时间(写成函数)
def func1():
print('你有病呀,领导,测试我的执行效率干甚。')
def func2():
print('你有病呀,领导2,测试我的执行效率干甚。')
func1()
def func1():
print('你有病呀,领导,测试我的执行效率干甚。')
func1()
def timmer(f):
start_time = time.time()
f()
time.sleep(0.3)
end_time = time.time()
print('此函数的执行效率%s' % (end_time - start_time))7.3测是一个函数执行时间(使用装饰器)
f1 = func1 # f1 = func1
func1 = timmer # 新变量func1 = timmer
func1(f1)
def func2():
print('你有病呀,领导,测试我的执行效率干甚。')
def timmer(f): # f = func1
def inner():
start_time = time.time()
f() # func1()
time.sleep(0.3)
end_time = time.time()
print('此函数的执行效率%s' % (end_time - start_time))
return inner
# 语法糖@
@timmer # func1 = timmer(func1)
def func1():
print('你有病呀,领导,测试我的执行效率干甚。')
func1 = timmer(func1) # inner
func1() # inner()7.4测是一个函数执行时间(优化装饰器)
def timmer(f): # f = func1 函数名
def inner(*args,**kwargs):
start_time = time.time()
f(*args,**kwargs)
time.sleep(0.3)
end_time = time.time()
print('此函数的执行效率%s' % (end_time - start_time))
return inner
@timmer # func1 = timmer(func1) # inner
def func1(a,b):
print(a,b)
print('你有病呀,领导,测试我的执行效率干甚。')
@timmer
def func2(a,b,c,d):
print(a,b,c,d)
print('你有病呀,领导,测试我的执行效率干甚。')
func1(1,2) # inner()
func2(2,3,4,5)
def timmer(f): # f = func1 函数名
def inner(*args,**kwargs):
start_time = time.time()
ret = f(*args,**kwargs)
time.sleep(0.3)
end_time = time.time()
print('此函数的执行效率%s' % (end_time - start_time))
return ret
return inner
@timmer # func1 = timmer(func1) # inner
def func1(a,b):
print(a,b)
print('你有病呀,领导,测试我的执行效率干甚。')
return 666
print('************',func1(1,2))