一、闭包
在Python中,闭包是指一个函数内部定义的函数,这个内部函数可以访问并修改其外部函数的局部变量,即使外部函数已经执行完毕。闭包可以通过多层函数嵌套来实现。
闭包的三要素:
1、外部函数嵌套内部函数
2、外部函数返回内部函数
3、内部函数可以访问外部函数的变量
闭包示例:
import random
def fun1():
print("fun1")
d0 = []
def fun2():
d0.append(random.randint(1, 20))
print("fun2", d0)
return fun2
# 不同的变量名存储的值不共用
r1 = fun1()
r1()
r1()
r1()
r1() # fun2 [18, 4, 12, 2]
r2 = fun1()
r2() # fun2 [13]
二、装饰器和装饰器案例
在Python中,装饰器是一种特殊的函数,用于修改其他函数的行为。装饰器函数接受一个函数作为输入,并返回另一个函数作为输出。装饰器函数可以通过在原始函数前后添加额外的代码,或者修改原始函数的输入和输出来修改其行为。
装饰器的语法使用@
符号,将装饰器函数应用到被装饰的函数上。
先以一个计算函数运行时间的为例:
import random
import time
data = [random.randint(0, 100000) for i in range(10000)]
# 这个函数在没有使用装饰器的格式时,可以看作一个闭包,作用就是计算某个函数运行的时间
def times(f):
def it():
start = time.time()
f()
print(time.time() - start)
return it
def my_fun1():
data.sort()
print(data)
r = times(my_fun1)
r() # 输出为 一个正序的列表 运行时间为0.007011890411376953
函数中的r = times(my_fun1)就是装饰器的基本使用原理。下面我们把这个例子写成装饰器的样式:
import random
import time
data = [random.randint(0, 100000) for i in range(10000)]
def times(f):
def it():
start = time.time()
f()
print(time.time() - start)
return it
@times() # 装饰器的书写格式
def my_fun1():
data.sort()
print(data)
my_fun1() # 输出为 一个正序的列表 运行时间为0.007011890411376953