当前位置: 首页 > news >正文

python 闭包、装饰器

一、闭包:

1. 外部函数嵌套内部函数  

2. 外部函数返回内部函数  

3.内部函数可以访问外部函数局部变量 

        闭包(Closure)是指在一个函数内部定义的函数,并且内部函数可以访问外部函数的局部变量,即使外部函数已经执行完毕,这种现象称为闭包。在Python中,闭包常常用来实现一些特定功能,例如保护变量、实现装饰器等。

import randomdef fun1():print("fun1")datas = []def fun2():datas.append(random.randint(0, 100))print("fun2", datas)return fun2r = fun1()
r()r1 = fun1()
r1()print(id(r), id(r1))

特点和用途:

  • 访问外部变量:闭包可以访问定义它们的外部函数的局部变量,即使外部函数已经返回,闭包仍然保留对这些变量的引用。

  • 保护变量:可以通过闭包来保护数据,因为外部函数的局部变量在闭包中不会被销毁或修改,除非内部函数显式地修改它们。

  • 实现装饰器:装饰器本质上就是闭包,它能够在不修改原函数代码的情况下,动态地增加功能。

闭包在Python中常用于函数式编程和实现一些高级的编程模式,能够提供更灵活和高效的编程解决方案。 

二、装饰器:

目的:不改变函数原有实现给函数添加新功能

概念:一个闭包就是一个函数+在创建这个函数时可以访问的变量

实现:闭包+@语法

        装饰器(Decorator)是Python中一种特殊的函数,它可以修改其他函数的行为或功能。装饰器本质上是一个函数,它接收一个函数作为输入,并返回一个新的函数作为输出。装饰器通常用于在不改变原函数代码的情况下,动态地增加功能、修改函数的行为或者执行额外的操作。

装饰器案例:

1.时间开销:

import random
import timedatas = [random.randint(1, 1000) for i in range(1000)]
datas_copy = datas.copy()def time_cost(f):def calc(sort_type):start = time.time()f(sort_type)print(f"{f.__name__} {time.time() - start}")return calc@time_cost
def fun1(sort_type):datas.sort(reverse=sort_type)print(datas)@time_cost
def fun2(sort_type):new_datas = sorted(datas_copy, reverse=sort_type)print(new_datas)# fun1 = time_cost(fun1)
fun1(True)# fun2 = time_cost(fun2)
fun2(True)

 权限校验:

user = Nonedef login_required(f):def chair():global userif user:f()else:while True:username = input("用户名")password = input("密码")if username == "admin" and password == "666666":user = "admin"f()breakelse:print("用户名或密码错误")return chairdef index():print("首页")@login_required
def center():print("个人中心")@login_required
def cart():print("购物车")index()# center = login_required(center)
center()# cart = login_required(cart)
cart()

装饰器的特点和用途:

  • 修改函数行为:装饰器允许我们在不修改原函数代码的情况下,添加、修改或扩展函数的行为。

  • 动态增加功能:可以在函数调用前后执行额外的操作,如输入验证、性能测试、日志记录等。

  • 代码复用和简化:装饰器可以避免代码重复,使代码更加简洁和易于维护。

  • 装饰器链:可以同时应用多个装饰器,形成装饰器链,每个装饰器可以独立地修改函数的行为。

在实际应用中,装饰器是Python中非常强大和灵活的特性,被广泛用于Web框架、日志系统、权限控制等需要动态修改函数行为的场景。 

相关文章:

python 闭包、装饰器

一、闭包: 1. 外部函数嵌套内部函数 2. 外部函数返回内部函数 3.内部函数可以访问外部函数局部变量 闭包(Closure)是指在一个函数内部定义的函数,并且内部函数可以访问外部函数的局部变量,即使外部函数已经执行…...

[pycharm]解决pycharm运行程序出现卡住scanning files to index索引的问题

有时候会出现索引问题,显示scanning files to index 解决方法: in pycharm, go to the "File" on the left top, then select "invalidate caches/restart...", and press "invalidate and restart". 然后等它自己重启…...

python每日学习11:numpy库的用法(下)

python每日学习11:numpy库的用法(下) 数组的拼接 名方法称说明concatenate连接沿现有轴的数组序列hstack水平堆叠序列中的数组(列方向)vstack竖直堆叠序列中的数组(行方向)concatenate函数用于沿指定轴连接相同形状的两…...

【Emacs有什么优点,用Emacs写程序真的比IDE更方便吗?】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…...

6、基于Fabirc 2.X 通用电子存证系统部署

evidence 将GOPATH设置为/root/go,拉取项目: cd $GOPATH/src && git clone https://gitee.com/henan-minghua_0/evidence.git 在/etc/hosts中添加: 127.0.0.1 orderer.example.com 127.0.0.1 peer0.org1.example.com 127.0.0.1 peer1.org…...

Linux Vim 由浅入深的教程

引言 原文链接 Vim是Linux系统中非常强大的文本编辑器,因其强大的功能和灵活的操作而受到广泛使用。尤其是在服务器管理和开发环境中,Vim几乎是必备工具。本教程将以CentOS 7为例,详细讲解Vim的安装、基本操作以及一些高级技巧,…...

MIT6.824(6.5840) Lab1笔记+源码

文章目录 其他人的内容,笔记写的更好,思路可以去看他们的MapReduceworkermapreduce coordinatorrpc纠错 源码worker.gocoordinator.gorpc.go 原本有可借鉴的部分 mrsequential.go,多看几遍源码 其他人的内容,笔记写的更好&#xf…...

【目录】8051汇编与C语言系列教程

8051汇编与C语言系列教程 作者将狼才鲸创建日期2024-07-23 CSDN文章地址:【目录】8051汇编与C语言系列教程本Gitee仓库原始地址:才鲸嵌入式/8051_c51_单片机从汇编到C_从Boot到应用实践教程 一、本教程目录 序号教程名称简述教程链接1点亮LCD灯通过IO…...

群管机器人官网源码

一款非常好看的群管机器人html官网源码 搭建教程: 域名解析绑定 源码文件上传解压 访问域名即可 演示图片: 群管机器人官网源码下载:客户端下载 - 红客网络编程与渗透技术 原文链接: 群管机器人官网源码...

整合EasyExcel实现灵活的导入导出java

引入pom依赖 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId></dependency>实现功能 结合Vue前端&#xff0c;实现浏览器页面直接导出日志文件实现文件的灵活导入文件导出 3. 实体类 实体类里有自定义转…...

springSecurity学习之springSecurity web如何取得用户信息

web如何取得用户信息 之前说过SecurityContextHolder默认使用的是ThreadLocal来进行存储的&#xff0c;而且每次都会清除&#xff0c;但是web每次请求都会验证用户权限&#xff0c;这是如何做到的呢&#xff1f; 这是通过SecurityContextPersistenceFilter来实现的&#xff0…...

eclipse中的classbean导入外部class文件,clean项目后删除问题

最近被eclipse搞得头疼&#xff0c;下午终于解决 eclipse创建的java项目中&#xff0c;类的输出目录是classbean。由于项目需要&#xff0c;classbean目录下已经导入了外部的类&#xff0c;但每次clean项目时&#xff0c;会把class删掉。 广泛查询&#xff0c;eclipse不清空c…...

OBD诊断(ISO15031) 0A服务

文章目录 功能简介ISO 15765-4的诊断服务定义1、请求具有永久状态的排放相关故障诊断码2、请求具有永久状态的排放相关故障诊断码3、示例报文 功能简介 0A服务&#xff0c;即 Request emission-related diagnostic trouble code with permanent status&#xff08;请求排放相关…...

ForCloud全栈安全体验,一站式云安全托管试用 开启全能高效攻防

对于正处于业务快速发展阶段的企业&#xff0c;特别是大型央国企而言&#xff0c;日常的安全部署和运营管理往往横跨多家子公司&#xff0c;所面临的挑战不言而喻。尤其是在面对当前常态化的大型攻防演练任务时&#xff0c;难度更是呈“几何级数”上升&#xff1a; 合规难 众…...

Java——————接口(interface) <详解>

1.1 接口的概念 在现实生活中&#xff0c;接口的例子比比皆是&#xff0c;比如&#xff1a;笔记本电脑上的USB接口&#xff0c;电源插座等。 电脑的USB口上&#xff0c;可以插&#xff1a;U盘、鼠标、键盘...所有符合USB协议的设备 电源插座插孔上&#xff0c;可以插&#xff…...

【C++】【继承】【子对象】【构造函数】含子对象的派生类的构造函数写法

&#xff08;1&#xff09;子对象的概念&#xff1a;若派生类A1的数据成员中包含基类A的对象a&#xff0c;则a为派生类A1的子对象 &#xff08;2&#xff09;含子对象的派生类的构造函数的执行顺序是&#xff1a; ①调用基类构造函数&#xff0c;对基类数据成员初始化 ②调用子…...

golang语言 .go文件版本条件编译,xxx.go文件指定go的编译版本必须大于等于xxx才生效的方法, 同一个项目多个go版本文件共存方法

在go语言中&#xff0c;我们不关是可以在编译时指定版本&#xff0c; 在我们的xxx.go文件中也可以指定go的运行版本&#xff0c;即 忽略go.mod中的版本&#xff0c;而是当当前的go运行版本达到指定条件后才生效的xxx.go文件。 方法如下&#xff1a; 我们通过在xxx.go文件的头部…...

深入浅出mediasoup—通信框架

libuv 是一个跨平台的异步事件驱动库&#xff0c;用于构建高性能和可扩展的网络应用程序。mediasoup 基于 libuv 构建了包括管道、信号和 socket 在内的一整套通信框架&#xff0c;具有单线程、事件驱动和异步的典型特征&#xff0c;是构建高性能 WebRTC 流媒体服务器的重要基础…...

每日一题 LeetCode03 无重复字符的最长字串

1.题目描述 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的最长字串的长度。 2 思路 可以用两个指针, 滑动窗口的思想来做这道题,即定义两个指针.一个left和一个right 并且用一个set容器,一个length , 一个maxlength来记录, 让right往右走,并且用一个set容器来…...

栈和队列(C语言)

栈的定义 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out&#xff09;的原则。 压栈&#xff1a;…...

从硬件连接到数据可视化:基于RS485-USB的传感器数据采集全流程解析

1. 硬件连接&#xff1a;从传感器到电脑的物理链路搭建 工业传感器数据采集的第一步&#xff0c;就是建立可靠的物理连接。以常见的星仪压力变送器为例&#xff0c;我们需要解决三个关键问题&#xff1a;传感器供电、信号传输转换、以及电脑端识别。这里我分享几个实际项目中容…...

【免费下载】 摩擦磨损仿真Archard模型 - FORTRAN子程序中文注释版:加速您的科研与工程项目

摩擦磨损仿真Archard模型 - FORTRAN子程序中文注释版&#xff1a;加速您的科研与工程项目 【下载地址】摩擦磨损仿真archard模型-FORTRAN子程序中文注释版 本仓库提供了一款专为摩擦磨损分析设计的Umeshmotion子程序模型&#xff0c;采用经典的Archard模型实现。此资源针对工程…...

智慧桥梁之桥梁裂缝 钢筋裸露识别 墙面裂缝分割数据集 桥梁病害数据集 yolo格式 图像分割数据集地10171期

病理研究相关数据集简介项目详情数据集类别聚焦病理研究领域&#xff0c;涵盖多种与病理相关的图像类别&#xff0c;可能包含不同器官、组织或疾病类型对应的病理图像&#xff0c;例如常见的炎症、肿瘤等病理状态下的样本图像分类数据集数量总数3210张&#xff0c;但从数据集命…...

Linux环境下KingbaseES(人大金仓)数据库的自动化部署与配置实践

1. 为什么需要自动化部署KingbaseES&#xff1f; 第一次手动部署KingbaseES数据库的经历让我记忆犹新。那天我在机房折腾了整整6个小时&#xff0c;光是反复输入各种命令就让人抓狂&#xff0c;更别提中间因为权限问题重装了三次。相信很多DBA同行都有过类似的痛苦体验——手动…...

HYCONTROL MICROFLEX-DB超声波液位计实操详解(参数+工况+故障排查)

在工业液位测量中&#xff0c;腐蚀性介质、罐内干扰、泡沫水汽、后期维护量大一直是现场普遍痛点&#xff0c;很多中小型储罐、水池、反应罐都会纠结性价比高、调试简单、稳定性强的超声波液位计。今天给大家详细拆解一款进口紧凑型液位变送器&#xff1a;英国HYCONTROL海康MIC…...

Elasticsearch 7.6.1 实战:从零构建招聘信息搜索服务(索引、数据与分页)

1. 从零搭建招聘搜索服务&#xff1a;为什么选择Elasticsearch&#xff1f; 最近在帮朋友改造招聘网站的后台搜索功能时&#xff0c;我果断推荐了Elasticsearch 7.6.1。这个版本在稳定性和功能完整性上达到了很好的平衡&#xff0c;特别适合中小型企业的搜索场景。相比传统数据…...

【亲测免费】 探索RS485通信的利器:开源项目推荐

探索RS485通信的利器&#xff1a;开源项目推荐 【下载地址】RS485通信程序 本仓库提供了一个完整的RS485通信程序&#xff0c;经过本人亲自测试&#xff0c;程序注释详细&#xff0c;非常适合作为学习和开发的参考例程。无论你是初学者还是有经验的开发者&#xff0c;这个资源都…...

自动驾驶安全基石:从ODD到ODC的设计原则与工程实践

1. 自动驾驶安全的底层逻辑&#xff1a;为什么需要ODD与ODC&#xff1f; 十年前我第一次接触自动驾驶系统时&#xff0c;工程师们最常讨论的是传感器精度和算法性能。直到参与某L3级高速领航项目后&#xff0c;我才真正理解&#xff1a;定义"在什么条件下能安全运行"…...

5 分钟快速上手 hoist-non-react-statics:提升组件静态属性的完整教程

5 分钟快速上手 hoist-non-react-statics&#xff1a;提升组件静态属性的完整教程 【免费下载链接】hoist-non-react-statics Copies non-react specific statics from a child component to a parent component 项目地址: https://gitcode.com/gh_mirrors/ho/hoist-non-reac…...

国产多模态大模型崛起:技术、场景与未来挑战全解析

国产多模态大模型崛起&#xff1a;技术、场景与未来挑战全解析 引言 在人工智能浪潮席卷全球的背景下&#xff0c;多模态大模型已成为技术竞争的新高地。以GPT-4V、Gemini为代表的国际巨头展现了强大的图文理解与生成能力&#xff0c;而国产模型正凭借对中文场景的深度优化、独…...