首页 > 其他分享 >闭包与装饰器

闭包与装饰器

时间:2024-01-11 15:34:23浏览次数:30  
标签:闭包 函数 time fun 装饰 def out

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

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

标签:闭包,函数,time,fun,装饰,def,out
From: https://www.cnblogs.com/plausible/p/17958532

相关文章

  • C++设计模式05 —— 装饰模式
    装饰模式过度的使用继承使得派生的子类过多,代码重复度很高,复用性变差。实现加密文件流、加密网络流、加密内存流、缓冲文件流、缓冲网络流、缓冲内存流。如果我们创建一个流基类,然后创建文件流继承流基类,最后创建加密文件流继承文件流、创建缓冲文件流继承文件流。如果这......
  • 如何使用Python装饰器来修改函数
    在Python中,装饰器是一种强大的工具,它可以用来修改函数的行为,而无须对函数本身进行修改。装饰器提供了一种简洁、灵活的方式来扩展函数的功能,使代码更加模块化、可复用,并且能够减少重复的代码。装饰器的基本概念是将一个函数作为参数传递给另一个函数,并返回一个新的函数。这个新的函......
  • JavaScript的闭包、执行上下文、到底是怎么回事?还有必要学吗?
    在上一课,我们了解了JavaScript执行中最粗粒度的任务:传给引擎执行的代码段。并且,我们还根据“由JavaScript引擎发起”还是“由宿主发起”,分成了宏观任务和微观任务,接下来我们继续去看一看更细的执行粒度。一段JavaScript代码可能会包含函数调用的相关内容,从今天开始,我们就用两......
  • Python笔记三之闭包与装饰器
    本文首发于公众号:Hunter后端原文链接:Python笔记三之闭包与装饰器这一篇笔记介绍Python里面的装饰器。在介绍装饰器前,首先提出这样一个需求,我想统计某个函数的执行时间,假设这个函数如下:importtimedefadd(x,y):time.sleep(1)returnx+y想要统计add函数......
  • 软件体系结构与设计模式之装饰模式和外观模式
    一.单选题(共4题)(单选题)某公司欲开发一个图形控件库,要求可以在该图形控件库中方便地增加新的控件,而且可以动态地改变控件的外观或给控件增加新的行为,如可以为控件增加复杂的立体边框、增加控件的鼠标拖拽行为等。针对上述需求,使用()模式来进行设计最合适。A.适配器(Adap......
  • Python 装饰器
    Python装饰器python装饰器的本质是:仅以一个函数为参数,并返回一个函数。且看以下案例:defdecorator(f): print(f.__name__) returnf#1@decoratordeffun(): print("runfun")#2fun=decorator(fun)以上两种写法是等价的;装饰器函数会在被装饰的函数定义完成时......
  • 闭包
    什么是闭包?闭包就是有权访问另一个函数作用域中变量的函数。简单理解就是:闭包是用来连接函数外部和内部的桥梁。如何从函数外部来访问另一个函数内部的变量呢?举个例子//当函数外部想要访问另一函数内部的变量时,需要使用returnfunctionouter(){letn=10;returnfu......
  • bitset优化传递闭包
    bitset优化传递闭包时间复杂度\(O(\frac{n^3}{w})\)#include<bits/stdc++.h>#defineF(i,l,r)for(inti=l;i<=r;++i)#defineG(i,r,l)for(inti=r;i>=l;--i)#definelllonglongusingnamespacestd;constintN=1005;bitset<N>f[N];intn;intmain......
  • 装饰器
    装饰器装饰代指为被装饰对象添加新的功能,器代指器具/工具,装饰器与被装饰的对象均可以是任意可调用对象。【一】装饰器的作用软件的设计应该遵循开放封闭原则,即对扩展是开放的,而对修改是封闭的。【二】装饰器的分类函数装饰器分为:无参装饰器和有参装饰器【三】无参装......
  • Decorator 装饰者模式简介与 C# 示例【结构型4】【设计模式来了_9】
    Decorator装饰者模式简介与C#示例【结构型4】【设计模式来了_9】 阅读目录〇、简介1、什么是装饰者模式2、优缺点和适用场景一、通过示例代码简单实现二、装饰者模式的结构三、相关模式回到顶部〇、简介1、什么是装饰者模式一句话解释:  通过继承统......