一、闭包
在Python中,闭包是指一个函数内部定义的函数,这个内部函数可以访问并修改其外部函数的局部变量,即使外部函数已经执行完毕。闭包可以通过多层函数嵌套来实现。
闭包的三要素:
1、外部函数嵌套内部函数
2、外部函数返回内部函数
3、内部函数可以访问外部函数的变量
闭包示例:
import randomdef 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 timedata = [random.randint(0, 100000) for i in range(10000)]# 这个函数在没有使用装饰器的格式时,可以看作一个闭包,作用就是计算某个函数运行的时间
def times(f): def it():start = time.time()f()print(time.time() - start)return itdef my_fun1():data.sort()print(data)r = times(my_fun1)
r() # 输出为 一个正序的列表 运行时间为0.007011890411376953
函数中的r = times(my_fun1)就是装饰器的基本使用原理。下面我们把这个例子写成装饰器的样式:
import random
import timedata = [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