闭包
格式:
在一个函数内部 嵌套另外一个函数 [函数内部声明的内容只能作用与函数本身 出了函数没有任何意义]
def out(参数列表):
外部函数体
def inner(参数列表):
内部函数体def out(): print("外部函数") def inner(): print("内部函数") #这种函数的内部函数的调用只能在外部函数体中调用 return inner
函数体外无法直接调用,但是可以利用函数可以被当作一个值传递间接调用
func = out() print(func) func() ''' 外部函数 --由func = out()产生 <function out.<locals>.inner at 0x000002169BEBA8C8> 内部函数 --由func()产生 '''
装饰器(decorator)
装饰器是特殊的闭包: 将内部函数当做外部函数的运行结果返回
def out(函数名字): #外层函数的参数的作用是 接受添加新需求的功能
外部函数
def inner(*values, **kwargs):
内部函数
result = 功能名字(*values, **kwargs)
return result
return inner装饰器的作用: 在不改变原有函数A的基础上,调用A,为A增加新的功能
添加装饰器的语法:
在指定函数的声明上方添加 @糖语法 @外部函数名例如:
@out
def func():练习:打印乘法表时计算出执行函数所用时间
import time def get_time(func): def inner(*values, **kwargs): start = time.time() result = func(*values, **kwargs) stop = time.time() print(stop - start) return result return inner @get_time def print_table(): time.sleep(1) for row in range(1, 2): for col in range(1, row + 1): print("%d * %d = %d" % (col, row, (col * row)), end="\t") print() print_table()