闭包
闭包(closure)是函数式编程的重要的语法结构。闭包也是一种组织代码的结构,它同样提高了代码的可重复使用性。
如果在一个内嵌函数里,对在外部函数内(但不是在全局作用域)的变量进行引用,那么内嵌函数就被认为是闭包(closure)。
定义在外部函数内但由内部函数引用或者使用的变量称为自由变量。
通俗点讲 闭包其实就是在一个函数中嵌套另一个函数的定义。
总结一下,创建一个闭包必须满足以下几点:
- 1. 必须有一个内嵌函数
- 2. 内嵌函数必须引用外部函数中的变量
- 3. 外部函数的返回值必须是内嵌函数
例如:
def FuncX(x):
'''闭包的作用:当外部函数返回了,外部函数的局部变量还可以被内部函数引用'''
print("---------开始-----------")
def FuncY(y):
print("函数内")
return x * y
print("---------结束-----------")
return FuncY
x=FuncX(3)
print(x(4))
装饰器
python装饰器就是用于拓展原来函数功能的一种函数,这个函数的特殊之处在于它的返回值也是一个函数,使用python装饰器的好处就是在不用更改原函数的代码前提下给函数增加新的功能。
装饰器就是一种的闭包的应用,只不过其传递的是函数:
- 装饰器用来装饰函数
- 返回一个函数对象
- 被装饰函数标识符指向返回的函数对象
- 语法糖 @deco
一个函数可以被装饰多次
def yangrou(y):
print("羊肉40")
def funY():
return 40+y()
return funY
def shucai(x):
print("蔬菜30")
def funx():
return 30+x()
return funx
@shucai
@yangrou #先执行yangrou在执行shucai
def diguo():
print("底锅50")
return 50
print(diguo())
带有不定参数的装饰器
用*args 和**kwargs来实现
import time
def deco(func):
def wrapper(*args, **kwargs):
startTime = time.time()
func(*args, **kwargs)
endTime = time.time()
msecs = (endTime - startTime)*1000
print("time is %d ms" %msecs)
return wrapper
@deco
def func(a,b):
print("hello,here is a func for add :")
time.sleep(1)
print("result is %d" %(a+b))
@deco
def func2(a,b,c):
print("hello,here is a func for add :")
time.sleep(1)
print("result is %d" %(a+b+c))
if __name__ == '__main__':
f = func
func2(3,4,5)
f(3,4)
#func()