一、函数名的应用
函数名是函数的名字,本质上是个变量,特殊的变量
函数名由:函数+()组成
函数() 执行函数
1,单独打印函数名,返回的是函数的内存地址。
2函数名的赋值
def func1():
print(666)
f=func1
f()# f=666
3、函数名可以作为容器类数据的元素
def f1():
print(666)
def f2():
print(662)
def f3():
print(646)
def f4():
print(466)
li=[f1,f2,f3,f4] #函数名作为列表的元素,是一个变量名。
for i in li:
i()
4,函数名可以作为参数
def f1():
print(666)
def f2(x):
x()
f2(f1)
5,函数名可以作为函数的返回值
def f1(x):
return x
ret=f1(5)
print(ret)
二、闭包
闭包:内层函数对外层函数(非全局)变量的引用
如何判断:内层函数名.—closure— cell就是闭包
def wrapper():
a =666
def inner():
print(a) #inner引用外层wrapper的变量a=666
inner()
print(inner.__closure__)
wrapper()
#666
(<cell at 0x005910D0: int object at 0x001FED90>,)
闭包:当函数开始执行时,如果遇到了闭包,他有一个机制,
他会永远开辟一个内存空间,将必包中的变量等值放入其中,不会随着函数的执行完毕而消失。
name='老男孩'
def wrapper(n):
#n=老男孩
def inner():
print(n)
inner()
print(inner.__closure__)
wrapper(name)
#老男孩
(<cell at 0x00476410: str object at 0x0046DBB8>,)
三、装饰器初识
在不改变原函数的执行的情况下,为原函数增加额外的功能。
import time def func1(): 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) func1 = timmer(func1) # inner func1() # inner()
四,被装饰函数带参数的装饰器
import time
def timer(func):
def inner(*args,**kwargs):
start = time.time()
re = func(*args,**kwargs)
print(time.time() - start)
return re
return inner
@timer #==> func1 = timer(func1)
def func1(a,b):
print('in func1')
@timer #==> func2 = timer(func2)
def func2(a):
print('in func2 and get a:%s'%(a))
return 'fun2 over'
func1('aaaaaa','bbbbbb')
print(func2('aaaaaa'))
装饰器模板
def wrapper(f):
def inner(*args,**kwargs):
'''执行函数之前的相关操作'''
ret = f(*args,**kwargs)
'''执行函数之后的相关操作'''
return ret
return inner