【闭包函数与装饰器大全】——python基础

news2024/12/29 10:40:29

目录索引

  • ==闭包:==
    • 闭包三要素:
    • 闭包的作用:
    • 闭包演示:
    • 闭包的意义:
  • ==装饰器:==
    • 特点:
    • 实例演示:
    • 实例演示2之参数:
  • ==装饰器常用的场景:==
    • 编写一个计时的装饰器:
      • *普通编写:*
      • *利用装饰器编写:*
    • 二级:

闭包:

闭包三要素:

1.函数嵌套,即外部函数嵌套一个内部函数
2.外部函数返回内部函数引用
3.内部函数使用外部函数的变量或者形参

闭包:一个嵌套函数,外部函数返回内部函数引用。内部函数使用外部函数的局部自由变量。

闭包的作用:

函数内变量的作用域也仅限于在函数内部,如果该函数执行完毕,内部的局部变量就会被销毁。可用来实现高阶函数。我们可以变量的认为闭包就是只有一个方法的类。

1.让局部变量常驻永存,不至于执行完毕被销毁(最重要的特点)
2.保护变量不容易被修改(因为用了函数嵌套,内部函数如果是调用外部函数变量是没问题的。但如果要更改外部函数的值则会报错。除非使用local声明局部变量才可以进行修改)

闭包演示:

  • 函数名的本质是变量名,可以被赋值、给别的变量赋值、做参数传递、做返回值
def outer():
    number = 1
    def inner():
        print(number)
        return number
    return inner

func = outer()#类比实例化对象,因为outer有返回值
func()
# 1

闭包的意义:

1.闭包不是必须的
2.没了闭包,python的功能不会受到影响(当然,装饰器必须要用闭包来写)
3.闭包可以提供一种额外的解决方案

在这里插入图片描述

装饰器:

装饰器:decorater

特点:

装饰器是通过闭包的方式实现的

  1. 外部函数接收一个函数作为函数的参数变量,内部函数中执行这个函数
  2. 内部函数接收需要的参数给执行的函数,返回执行结果
  3. 内部函数中可以添加额外的功能代码
  4. 外部函数将内部函数返回
  5. 装饰器如果不用闭包来写的话,没法返回一个被修改的新函数。也就是说inner充当的是新函数,最后被返回出去。
  1. 装饰器遵循开放封闭原则,即原函数是封闭的,但是可以通过装饰器来修改原函数(人话就是,我要你更新我的软件,但是我不能把源代码给你。你就用装饰器直接修改就可以,不用通过源代码)
  2. 装饰器的本质就是闭包,是特殊的闭包函数。

实例演示:

def outer(func):
    #这个参数其实就相当于你要修饰的函数
    sentence = "我是新增的句子"
    def inner():
        func()#调用装饰函数,修改的内容就把代码写在下面
        print(sentence)

    return inner


@outer #语法糖的写法,在不改变原来函数的基础上,给函数增加新的功能。修改后的函数已经是新函数了。
def person():
    print("对自己的观点持毫不动摇地坚信,对不同意见起最小的情绪反应。")

person()

在这里插入图片描述

要点分析

装饰器的外部函数一定要用一个变量来接收被装饰的函数,之后在内部函数中进行调用。这样一来就可以实现修改功能。

实例演示2之参数:

对于带有参数的函数,装饰器里面的内部函数也要带参数,毕竟内部函数需要调用被装饰函数,所以参数上面也要保持一致。

def outer(func):
    #这个参数其实就相当于你要修饰的函数
    sentence = "我是新增的句子"
    def inner(num):
        func(num)
        print(sentence)

    return inner


@outer
def person(num):
    print("对自己的观点持毫不动摇地坚信,对不同意见起最小的情绪反应。")
    print(num)

person(1)

在这里插入图片描述

对于装饰器共有2个地方需要添加参数:

  1. 内部函数inner(参数)
  2. 调用被装饰函数func(参数)

语法糖语法补充:

  • 语法糖用@写法写在被装饰函数的上一行,语法糖只装饰下方的一个函数。
  • 其实就是将被装饰的函数名传递给装饰器去执行(自动传参),然后再返回给内部函数inner,最后再赋值给同名的被装饰函数变量。函数被装饰之后,就不再是原来的函数了。(相当于重新赋值了一遍)

装饰器常用的场景:

  • 引入日志
  • 函数执行时间统计
  • 执行函数前预备处理
  • 执行函数前的清理功能
  • 权限校验等

编写一个计时的装饰器:

普通编写:

#编写一个查看时间戳的函数
import time

def func1():
    time.sleep(2)
    print("func1发动,休眠两秒")

#查看程序运行的时间戳
start_time = time.time()
print(f"开始的时间为:{start_time}")
func1()
end_time = time.time()
print(f"结束的时间为:{end_time}")
print(f"总运行时间为:{end_time-start_time}秒")

在这里插入图片描述

利用装饰器编写:

import time
def runtime(func):
    def inner():
        start = time.time()
        # func()
        a = func()#用a变量来接收func1的return值
        end = time.time()
        print(f"函数执行用时{end - start}s")
        return print(a) # 返回传递的func()的返回值
    return inner

@runtime # func1 = runtime(func1)
def func1():
    time.sleep(2)
    print("func1......")
    return 10000
# return 10000 如何实现返回func1的返回值?在inner里添加一个变量a接收即可
func1()

在这里插入图片描述

二级:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/650430.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AIGC和虚拟现实为什么必然产物

背景 在流量存量时代,内容运营重要性不言而喻。在流量时代,内容可以不要过于多样化和差异化,只需要有足够多的人流量,按流量转化比率来看,1000个人有1%概率转化,素材不变只要增加足够多的流量那就一定会有…

永久存储:文件处理与路径处理

📢博客主页:盾山狂热粉的博客_CSDN博客-C、C语言,机器视觉领域博主📢努力努力再努力嗷~~~✨ 💡大纲 ⭕如何将数据永久的存放到硬盘上 👉不要打开文件,然后直接关闭文件,会导致截断 一、如何操作…

OneNote支持Markdown:高亮代码

文章目录 结论在前效果安装日常工作流(高亮代码块) 结论在前 markdown对我来说是伪需求,真正需要的是高亮代码,通过Github/NoteHighlight2016这个开源插件可实现这个插件虽然叫2016,但实测onenote 2013也是可以用的 效…

华为OD机试之数组去重和排序(Java源码)

数组去重和排序 题目描述 给定一个乱序的数组,删除所有的重复元素,使得每个元素只出现一次,并且按照出现的次数从高到低进行排序,相同出现次数按照第一次出现顺序进行先后排序。 输入描述 一个数组 输出描述 去重排序后的数组…

使用微信怎么图片投票怎么设置qq里面投票是如何

手机互联网给所有人都带来不同程度的便利,而微信已经成为国民的系统级别的应用。 现在很多人都会在微信群或朋友圈里转发投票,对于运营及推广来说找一个合适的投票小程序能够提高工作效率,提高活动的影响力。 那么微信做投票的小程序哪个比较…

苹果头显Vision Pro深度解读2 软件开发者谁最受益?

1 软件开发者谁最受益? 开发Vision pro这种设备的软件啊,首先得跟vision pro本身的特点结合起来,比如它本质上并不是一个很适合移动的的设备。用户大多数时候,都是坐着,站着,躺着使用。 所以典型的应用场…

【Linux】文件描述符与重定向操作

系列文章 收录于【Linux】文件系统 专栏 对于Linux下文件的写入与读取,以及文件原理还有疑惑的可以看看上一篇文章浅谈文件原理与操作。 目录 系列文章 再谈文件描述符 ​编辑 IO函数的本质 一切皆文件 文件重定向 原理 系统接口 再谈文件描述符 &#x…

C语言 指针(特别篇)

本篇目录 C语言 指针(特别篇)内存地址简要介绍C语言指针C语言的指针可以指向什么?取地址符 &(Address-of Operator)C语言中的 * 号运算符示例集:指向变量的指针指向数组的指针指向字符串的指针二级指针指针数组的…

doris docker部署 1.2.4.1版本

目录 写在前面 镜像编译 准备工作 下载编译好的包 fe be 编辑初始化文件 fe be 编辑Dockerfile fe be 构建镜像 fe be 构建结果 镜像运行 fe be 修改配置 添加udf依赖 启动be 注册be 错误分析 写在前面 以下操作语句按顺序执行即可,如果需要…

泛型Generic

泛型 1. 介绍1.1 使用泛型的好处 2. 自定义泛型结构:泛型类、泛型接口;泛型方法2.1 泛型类、泛型接口2.2 泛型方法 3. 其他3.1 泛型在继承方面的体现3.2 通配符使用3.2.1 有限制的通配符 1. 介绍 把元素的类型设计成一个参数,这个类型参数叫…

数组6大排序算法

快速排序 核心算法: 1.取一个基准值(一般是数组中间的元素),遍历数组,比基准值大的放右边,小的放左边,相等的则不动 2.分别创建三个数组来存储元素,最后将三个数组拼接起来 3.循…

Java替换Jar文件中的class文件方法

备份源文件 文件不重要的话可以不需要备份,线上环境务必备份方便回滚 mkdir bak cp test.jar bak 查看class文件所在目录 jar -tvf test.jar | grep Time.class 标红内容就是需要替换的class文件,如果有多个文件需要替换依次执行2,3步骤…

webSocket实时通信02——基于Spring【纯后端——JAVA】

这里是基于Spring整合websoket后来实现的实时通信&#xff0c;这里只有java的代码&#xff0c;通过在线网站 http://www.websocket-test.com/测试即可 1. 导包 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-star…

网络安全合规-职业发展路线

网络安全人才一将难求&#xff0c;缺口高达 95% 在以前&#xff0c;很多政企单位在进行 IT 部门及岗位划分时&#xff0c;只有研发和运维部门&#xff0c;安全人员直接归属到基础运维部&#xff1b;而现在&#xff0c;越来越多单位为了满足国家安全法律法规的要求&#xff0c;…

终极攻略!如何彻底防止Selenium被检测!

在使用Selenium进行爬虫时&#xff0c;许多朋友都会遇到各种反爬措施。 实际上&#xff0c;在绝大多数情况下&#xff0c;网站轻而易举地能够检测出你正在使用WebDriver而非标准浏览器。 本文将详细介绍如何有效防止检测的方法。 在一篇公众号文章《别去送死了。Selenium 与…

【重磅】智能未来 —— 人工智能与城乡规划的交叉对话(CSDN深圳城市开发者社区首场线下技术交流活动)

文章目录 活动主题活动海报活动时间活动地点互动有礼加入有礼赠书简介特别说明 活动主题 智能未来-人工智能与城乡规划的交叉对话 —— 以 AI 为核心主题&#xff0c;探索 AI 在 智慧城市、智能视频、智能编程 等重点领域的技术发展和实战落地。 活动海报 活动时间 2023.06…

加密与解密 调试篇 动态调试技术 (五)-WinDbg

windbg主要厉害的地方是在他可以对内核调试 并且本身微软的产品 对windows调试适配度够高 注意 windbg给出的图形操作并不好用 主要是使用命令行来进行操作 我们省略安装 直接进入调试 file 可以打开软件 可以附加也可以分析dump文件还可以进行内核和 远程调试内核调试分为…

招商基金资深架构师教你如何搭建统一监控平台

随着数字化进程的加速和业务的高速发展&#xff0c;系统的复杂程度日益升级&#xff0c;为确保业务系统的连续性和稳定性&#xff0c;越来越多的企业想要建设统一的监控平台&#xff0c;但却不知道从哪里开始着手。比如&#xff1a; 有些企业会直接将监控系统页面集成到统一监…

SpringBoot配置文件application.yml的理解

一、存放位置分类 1.当前项目根目录下的config目录下 2.当前项目的根目录下 3.resources目录下的config目录下 4.resources目录下 按照这上面的顺序&#xff0c;4个配置文件的优先级依次降低。 二、自定义存放位置和自定义命名 自定义存放位置和自定义配置文件命令和appl…

Python从Excel读取数据并使用Matplotlib绘制成二维图像

本课程实现使用 Python 从 Excel 读取数据&#xff0c;并使用 Matplotlib 绘制成二维图像。这一过程中&#xff0c;将通过一系列操作来美化图像&#xff0c;最终得到一个可以出版级别的图像。本课程对于需要书写实验报告&#xff0c;学位论文&#xff0c;发表文章&#xff0c;做…