闭包
在一个函数的内部定义了另一个函数,外部的函数叫它外函数,内部的函数叫它内函数。
一般情况下,一个函数结束,函数的内部所有东西都会释放掉,还给内存,局部变量都会消失。但是闭包是一种特殊情况,如果外函数在结束的时候发现有自己的临时变量将来会在内部函数中用到,就把这个临时变量绑定给了内部函数,然后自己再结束
'''闭包实现计数器功能'''
def count():
i = [0]
def add():
i[0]+=1
return i[0]
return add
cou = count()
print(cou())
print(cou())
print(cou())
运行结果:
1
2
3
装饰器
装饰器(fuctional decorators)用于拓展原来函数功能的一种函数,在不改变原函数名(或类名)的情况下,给函数增加新的功能。装饰器的返回值也是一个函数对象。它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景
import time
def timer(func):
def wrapper():
startTime = time.time()
func()
stopTime = time.time()
print('运行时间是:%s' %(stopTime-startTime))
return wrapper
@timer
def i_sleep():
time.sleep(2)
运行结果:
运行时间是:2.0000321865081787
装饰器传参
'''装饰器之参数传递'''
def tips(argv):
def ntips(func):
def nei(a,b):
print("函数的名字是%s " %func.__name__)
print("start!!装饰器传递的参数是 %s" %argv)
func(a,b)
print("stop")
return nei
return ntips
@tips("add+")
def add(a,b):
print(a+b)
add(3,4)
运行结果:
函数的名字是add
start!!装饰器传递的参数是 add+
7
stop