闭包与装饰器

发布时间 2024-01-11 15:30:13作者: plausible

闭包,又称闭包函数或者闭合函数,闭包函数就是指在一个嵌套函数里的内层函数,然后用内层函数来操纵外层函数的数据

1.闭包函数

点击查看代码
def out_fun():   #外层函数
    def in_fun():   #内层函数
      print(10)
    return in_fun   #外层函数返回值,返回的是内层函数本身

out_fun()
点击查看代码

在这段代码中in_fun函数就是闭包函数中的内层函数,out_fun函数是外层函数,外层函数返回的并不是一个具体的值,而是内层函数本身,所以当我们调用out_fun函数时,实际上调用的是它的返回值in_fun函数本身,是in_fun函数的整个函数体(一个函数对象),我们并未执行in_fun函数,所以调用out_fun函数时我们并不能得到10这个结果

点击查看代码
def out_fun():
    def in_fun():
      print(10)
    return in_fun

fun = out_fun()    #获取out_fun函数返回值in_fun函数
fun()    执行in_fun函数
点击查看代码
10
这段代码中,我们用变量fun接收out_fun函数的返回值in_fun,然后用fun()执行in_fun函数,最后得到结果10

在闭包函数中真正做事情的函数其实就是内层函数,它的作用就是通过一种间接的方式给函数传参或者进行操作,但是单纯的闭包函数其实并没有什么意义,它一般都是配合装饰器使用的

2.装饰器

点击查看代码
import time

start_time = time.time()


def fun():
    time.sleep(2)


fun()
end_time = time.time()
print(f'这个函数一共运行了{int(end_time - start_time)}秒')

在上面的程序中我们获取到了fun函数执行所需要的时间,但这种方法显然只适用于获取少量函数的执行时间,如果定义了大量的函数且都需要获取它们的执行时间,这种方法就会显得繁琐且笨拙,所以我们需要一种方法,能够快速且简便地完成获取执行时间的功能,这种方法就是装饰器

点击查看代码
import time


def fun():
    time.sleep(2)


def get_time(f):   #外层函数
    def mid_time():   #内层函数
        start_time = time.time()   #起始时间
        f()
        end_time = time.time()    #结束时间
        print(f'这个函数一共运行了{int(end_time - start_time)}秒')

    return mid_time


overall = get_time(fun)    #传入fun函数,并获取mid_time函数
overall()    #执行mid_time函数

点击查看代码
这个函数一共运行了2秒

在这个程序中我们定义了一个闭包函数,,它的外层函数接收一个参数,我们可以传入目标函数,它的内层函数完成了获取该函数执行时间的操作并返回给了外层函数,然后用一个变量接收外层函数的返回值,最后执行内层函数,完成获取时间操作

点击查看代码
import time



def get_time(f):   #外层函数
    def mid_time():   #内层函数
        start_time = time.time()   #起始时间
        f()
        end_time = time.time()    #结束时间
        print(f'这个函数一共运行了{int(end_time - start_time)}秒')

    return mid_time


@get_time
def fun():
    time.sleep(2)

fun()

点击查看代码
这个函数一共运行了2秒

在python中,我们可以将代码变得更加简洁,装饰器写好后,我们可以直接在要添加功能的函数上面写上@装饰器名,这样再调用函数时就已经默认这个函数拥有了装饰器里面的功能