【python】闭包和装饰器

前置知识:

  1. 函数的本质就是变量名
  2. 可以把函数作为参数传递,例如:
def func():print("我是func")# 接收的fn是个函数
def handle(fn):
# 调用函数fn()handle(func)
  1. 可以把函数作为返回值返回,例如
def func():def func2():print("我是func2")# func2函数作为返回值return func2fn = func()
fn()

闭包

闭包:内层函数对外层函数的变量的使用
作用1:让一个变量被外部访问,但是不能修改
作用2:让一个变量常驻内存

def func():a = 10def inner():print(a)return areturn inner# 函数外部访问到了变量a
fn = func()
fn()

装饰器

本质: 装饰器的本质就是一个函数,该函数的参数是被装饰的函数,返回值是装饰后的函数
作用: 装饰器可以在不改变原有代码的基础上,给函数添加新的功能

一、装饰器雏形(理解)

装饰器雏形

def wrapper(fn):def inner():print("执行被装饰函数之前")fn()print("执行被装饰函数之后")return innerdef add():print("我是add")# 向wrapper函数传入了add函数,返回的函数命名为add
add = wrapper(add) # 装饰器的关键语句!!!
add() # 这里执行add()相当于执行inner(),因为wrapper返回的是inner函数

装饰器雏形用语法糖的形式写

def wrapper(fn):def inner():print("执行被装饰函数之前")fn()print("执行被装饰函数之后")return inner@wrapper    # 用语法糖/装饰器的写法应该这么写,等价于执行add = wrapper(add)
def add():print("我是add")add() # 这里执行add()相当于执行inner(),因为wrapper返回的是inner函数

二 、通用装饰器(重点记住)

通用装饰器的固定写法如下:
(wrapper、inner、fn都是可以随意命名的,并非固定的)

def wrapper(fn):# *args和**kwargs用于接受被装饰函数的参数def inner(*args, **kwargs):"""在被装饰函数之前执行的操作"""# 注意:这里的*和**是将args和**kwargs打散传递给fn函数ret = fn(*args, **kwargs) # 被装饰函数"""在被装饰函数之后执行的操作"""return ret   # 处理被装饰函数的返回值return inner

三、高阶装饰器(理解)

即同一个函数被多个装饰器装饰

四、带参数的装饰器(理解)

举例:

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

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

相关文章

CPU的三大调度

计算机系统中的调度可以分为不同层次,包括作业调度、内存调度和进程调度。这三种调度分别负责管理和优化计算机系统中不同层次的资源分配和执行顺序。 高级调度:作业调度(Job Scheduling): 作业调度是指对提交到计算…

了解c++11中的新增

一,统一的初始化列表 在引入c11后,我们得出计划都可以用初始化列表进行初始化。 C11 扩大了用大括号括起的列表 ( 初始化列表 ) 的使用范围,使其可用于所有的内置类型和用户自 定义的类型, 使用初始化列表时,可添加等…

Vue学习计划-Vue2--VueCLi(二)vuecli脚手架创建的项目内部主要文件分析

1. 文件分析 1. 补充: 什么叫单文件组件? 一个文件中只有一个组件 vue-cli创建的项目中,.vue的文件都是单文件组件,例如App.vue 2. 进入分析 1. package.json: 项目依赖配置文件: 如图,我们说主要的属性…

性能测试经典面试题(带答案)!

概述一下性能测试流程? 1.分析性能需求。挑选用户使用最频繁的场景来测试。确定性能指标,比如:事务通过率 为100%,TOP99%是5秒,最大并发用户为1000人,CPU和内存的使用率在70%以下2.制定性能测试计划&…

Ubuntu20.04使用cephadm部署ceph集群

文章目录 Requirements环境安装Cephadm部署Ceph单机集群引导(bootstrap)建立新集群 管理OSD列出可用的OSD设备部署OSD删除OSD 管理主机列出主机信息添加主机到集群从集群中删除主机 部署Ceph集群 Cephadm通过在单个主机上创建一个Ceph单机集群&#xff0…

游戏开发库

整理了38个Python游戏开发库 https://zhuanlan.zhihu.com/p/505095419 https://zhuanlan.zhihu.com/p/262012936 2023 年最佳游戏引擎推荐 https://zhuanlan.zhihu.com/p/624771157 十大开源游戏引擎深入比较之美 https://blog.51cto.com/u_15273495/2915535 panda3d https:…

【EI会议征稿中】第三届网络安全、人工智能与数字经济国际学术会议(CSAIDE 2024)

第三届网络安全、人工智能与数字经济国际学术会议(CSAIDE 2024) 2024 3rd International Conference on Cyber Security, Artificial Intelligence and Digital Economy 第二届网络安全、人工智能与数字经济国际学术会议(CSAIDE 2023&…

Verilog基础:寄存器输出的两种风格

相关文章 Verilog基础https://blog.csdn.net/weixin_45791458/category_12263729.html?spm1001.2014.3001.5482 Verilog中的寄存器操作一般指的是那些对时钟沿敏感而且使用非阻塞赋值的操作。例如状态机中的状态转移,实际上就是一种寄存器操作,因为这相…

听GPT 讲Rust源代码--src/tools(10)

File: rust/src/tools/rust-analyzer/crates/ide-assists/src/handlers/generate_is_empty_from_len.rs 在Rust源代码中,rust-analyzer是一个Rust语言的IDE插件和代码分析器。其中,generate_is_empty_from_len.rs是rust-analyzer中的一个处理程序&#x…

终于有人把tcp、http、rpc和grpc总结完整了

随着微服务的迅速发展,各大互联网企业也投入到微服务的​使用种。微服务最大的特点是,跨进程、跨服务、跨语言之间的调用,使得我们能够像调用本地类、函数一样。当微服务具备该特点,将我们复杂的业务拆分成不同的服务,…

CentOS7安装Docker,DockerCompose

安装docker 1、卸载docker 查看是否有旧版本docker docker info首先检测我们虚拟机是否已经安装过Docker,如果安装则需卸载。代码中“\”符号为换行符,相当于一行内容分为多行,这是检测docker的各种组件 yum remove docker \docker-clien…

VGG模型

概念: CNN感受野 在卷积神经网络中,决定某一层输出结果中的一个元素所对应的输入层的区域大小,被称作感受野(receptive field)。通俗的解释是,输出feature map上的一个单元对应输入层上的区域大小。 VGG…

协同过滤算法springboot+java+ssm高校图书馆图书借阅管理系统k32vr

课题主要分为四大模块:即管理员模块,员工模块,教师模块和学生模块,主要功能包括:首页,个人中心,员工管理,学生管理,教师管理,图书分类管理,图书信…

wsl2 ubuntu上搭建OpenIM

文档 踩坑 版本要选择好,不要直接main来跑,目前版本OpenIMServer 有release-v3.3和release-v3.4,对应Chat版本的release-v1.4和release-v1.4。但我跑3.4是有问题的,切到3.3可以跑通。export OPENIM_IP"http://ip:10002"…

HNU计算机结构体系-实验2:CPU动态指令调度Tomasulo

文章目录 实验2 CPU动态指令调度Tomasulo一、实验目的二、实验说明三、实验内容问题1:问题2:问题3:问题4:问题5: 四、思考题问题1:问题2: 五、实验总结 实验2 CPU动态指令调度Tomasulo 一、实验…

【数据挖掘】国科大苏桂平老师数据库新技术课程作业 —— 第三次作业

part 1 设计一个学籍管理小系统。系统包含以下信息: 学号、学生姓名、性别、出生日、学生所在系名、学生所在系号、课程名、课程号、课程类型(必修、选修、任选)、学分、任课教师姓名、教师编号、教师职称、教师所属系名、系号、学生所选课…

汽车网络安全--ISO\SAE 21434解析(一)

目录 1.标准总览 2.示例分析 2015年美国黑帽大会,知名网络安全专家Charlie Miller和Chris Valasek详细描述了他们是如何在有限距离下通过WiFI入侵到Jeep大切诺基的中控系统,从此关于汽车网络安全的讨论拉开了序幕。 2016 年,ISO 道路车辆技术委员会与 SAE 联合成立 SC32/…

【算法每日一练]-结构优化(保姆级教程 篇5 树状数组)POJ3067日本 #POJ3321苹果树 #POJ2352星星

目录 今天知识点 求交点转化求逆序对,每次操作都维护一个y点的前缀和 树的变动转化成一维数组的变动,利用时间戳将节点转化成区间 先将y排序,然后每加入一个就点更新求一次前缀和 POJ3067:日本 思路: POJ3321苹…

案例063:基于微信小程序的传染病防控宣传系统

文末获取源码 开发语言:Java 框架:springboot JDK版本:JDK1.8 数据库:mysql 5.7 开发软件:eclipse/myeclipse/idea Maven包:Maven3.5.4 小程序框架:uniapp 小程序开发软件:HBuilder …

leetcode系列:反转链表的形象表示

反转链表是一道比较简单的题,主要考察的是对链表数据结构的理解和双指针应用,比较容易出错的地方是指针的移动顺序。在练习的过程中想到了一个比较形象的表示方法,于是记录下来。 # Definition for singly-linked list. # class ListNode: #…