首页 > 编程语言 >python进阶---闭包与装饰器

python进阶---闭包与装饰器

时间:2024-07-23 10:24:39浏览次数:13  
标签:闭包 fun1 函数 python --- time 装饰 def

一、闭包

        在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

标签:闭包,fun1,函数,python,---,time,装饰,def
From: https://blog.csdn.net/2402_86110194/article/details/140625711

相关文章

  • Android开发 - LayoutParams解析
    LayoutParams翻译过来就是布局参数,子View通过LayoutParams告诉父容器(ViewGroup)应该如何放置自己。从这个定义中也可以看出来LayoutParams与ViewGroup是息息相关的,因此脱离ViewGroup谈LayoutParams是没有意义的。事实上,每个ViewGroup的子类都有自己对应的LayoutParams类,典型的如L......
  • 2024-IDEA下载安装教程
    IDEA下载安装教程IDEA官网:IntelliJIDEA–theLeadingJavaandKotlinIDE(jetbrains.com)下载IDEA   双击运行ideaIU-2024.1.4.exe 安装     激活idea 链接:https://pan.baidu.com/s/1_lMVe0oODa-b4BrQJrpZTw?pwd=3456提取码:3456  ......
  • 强制从当前包自动导入的 Python 以此包的名称为前缀
    我在VSCode中使用Python和Pylance扩展。在我正在编辑的自己的包中,自动添加的导入(设置“导入格式:绝对”)如下所示:frommydirectory.myfileimportmyclass但是,我的Python包正在被被一个(非常愚蠢且不可协商的)外部系统消耗,该系统拒绝正确解释它,除非导入的格式特别......
  • Python语言-面向对象
    知识代码classJobSalary(object):job=''def__init__(self,city):self.jobname="数据分析师"self.exp=''self.city=city#方法defdata_normalize(self,data):print(f'正在规范化......
  • 【2024-07-22】连岳摘抄
    23:59赤日几时过,清风无处寻。经书聊枕籍,瓜李漫浮沉。兰若静复静,茅茨深又深。炎蒸乃如许,那更惜分阴。                                                 ——《大暑》宋·......
  • 需要帮助使用 Selenium Python 单击 Microsoft Teams 按钮
    我将Python与Selenium结合使用,并自动登录MicrosoftTeams。进入后,弹出窗口显示我需要单击“立即切换”以切换到V2版本。我似乎无法使用SeleniumPython成功单击此按钮。谁能帮我自动点击这个按钮?这是我不成功的尝试:self.driver.find_element(By.CLASS_NAME,......
  • 大金中央空调全国24小时收服务热线-(大金)全国统一售后400电话人工客服
    DAIKIN大金中央空调售后电话(全国售后网点)24小时客服热线400-9910208大金空调全国市各区售后维修24小时服务400-991-8812上门服务范围:全市)市区及周边乡镇(各区等等)均有维修服务网点,就近安排维修师傅上门维修。当您需要维修服务时,我们的就能及时赶到现场。服务为先,满意为念,服务无......
  • luoguT342340 差分 - 谁多谁闪亮
    差分-谁多谁闪亮题目背景外星人来地球游玩,他们到达某个贫困的小县城,这里有n*m个小村庄整齐排列着,外星人一看是个矩形排列,一下子来了兴趣,想在这里游玩,但无奈,已经天黑,没有一点灯光,他们只能使用法术,将某些村庄照亮。说来外星人也是很有礼貌的,他们也模仿着村庄的样子,每次给某些a......
  • Docker 笔记 - Docker 容器重启策略 --restart 介绍和实战
    https://zhuanlan.zhihu.com/p/494370957 1.Docker容器的重启策略目的为了保证容器运行时健壮性(自愈),Docker提供了容器重启策略,即使用参数--restart,它可以让容器在退出时自动尝试重启。场景Docker容器的重启策略一般用于生产环境,开发环境和实验环境可以忽略。例如使......
  • 网站安全-CDN篇
    为了保证CDN不被恶意刷流量导致高额账单,可以对CDN做防护措施,或使用高防CDN。‍‍‍普通CDN普通CDN受到恶意攻击,也是会计费的。目前国内大部分CDN厂商都是这样的套路:即使你的CDN流量用完了,还是会继续计费(也就是先欠着),等到记账周期到了(例如次日)再提供账单给你,让你......