目录

一、闭包的概念

1.概念

2.闭包的特征

 3.闭包的作用

二、装饰器

1.什么是装饰器

2.装饰器的作用

1.统计代码耗时

2.对代码进行权限检查

3.记录日志

3.闭包和装饰器的关系

4.注意事项:




一、闭包的概念

1.概念

闭包(Closure)指一个函数捕获并保存了其外部作用域的变量,即使外部函数已经执行完毕。闭包允许函数访问其定义时的上下文环境,而不仅限于当前作用域。

2.闭包的特征

  • 一个函数里嵌套另一个函数
  • 内部函数引用外部函数的变量
  • 外部函数返回内部函数本身,而不是调用结果
def outer_function(x):def inner_function(y):return x + y  # 引用了外部函数的变量xreturn inner_function  # 返回内部函数对象closure = outer_function(10)
print(closure(5))  # 输出15(10 + 5)

 3.闭包的作用

  •     保留状态:外层函数的变量不会因为函数执行完而被销毁;
  •     实现工厂函数:比如创建多个带不同参数的函数;
  •     实现装饰器(decorators)的基础。

二、装饰器

1.什么是装饰器

装饰器是一种在闭包的基础上,在不修改原函数代码的基础上,可以给函数扩展一些特定的功能,装饰器本质也是一个函数,是一个接受函数作为参数的高阶函数

2.装饰器的作用

1.统计代码耗时

import time
def cost_time(fun):def clac(*args):start = time.time()r = fun(*args)print(f"{fun.__name__}是{r}")end = time.time()print(f"耗时是{end - start}")return rreturn clacdef FB(i):if i == 1 or i == 2:return 1else:return FB(i-1) + FB(i - 2)def xh(n):a = 1b = 1for i in range(3,n + 1):c = a + ba = bb = cif i == n:return cdg = cost_time(xh)
FB = cost_time(FB)
FB(10)
dg(10)

2.对代码进行权限检查

from functools import wraps
user = None
def fun2(fun):@wraps(fun)def fun1():global userif user:fun()else:name = input("用户名:")psd = input("密码:")if name == 'admin' and psd == "123456":user = namefun()else:print("账号或密码输入错误")return fun1
@fun2
def login():print("欢迎登录")
@fun2
def shopping():print("欢迎来到购物车")def index():print("欢迎来到首页")
login()
shopping()

3.记录日志

from  datetime import time,datetime,date
def log(fun):def log1(*args,**kwargs):print(f"{date.today()}进行了{fun.__name__}操作,变量有{args},关键字有{kwargs}")result = fun(*args)print(f"{date.today()}结束了{fun.__name__}操作,返回值有{result}")return resultreturn log1
@log
def add(a,b,c):c = a + b + creturn c
add(2, 3, 4, )

3.闭包和装饰器的关系

装饰器依赖闭包实现,装饰器一般用于高级应用场景,专门用于函数增强

4.注意事项:

1.多层装饰器是按照从上到下的顺序执行

2.装饰器会覆盖原来函数名称,可以用function.wraps来修复

3.闭包修改外部变量需要用nonlocal声明变量

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

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

相关文章

解决hadoop常用到的问题

1.namenode无法启动问题 报错1. ERROR: Attempting to operate on hdfs namenode as root ERROR: but there is no HDFS_NAMENODE_USER defined. 原因:不能用 root 用户直接启动 Hadoop 的 HDFS 组件(NameNode / DataNode / SecondaryNameNode&#xff0…

深度学习G3周:CGAN入门(生成手势图像)

🍨 本文为🔗365天深度学习训练营中的学习记录博客🍖 原作者:K同学啊 基础任务: 1.条件生成对抗网络(CGAN)的基本原理 2.CGAN是如何实现条件控制的 3.学习本文CGAN代码,并跑通代码…

流式数据处理实战:用状态机 + scan 优雅过滤 AI 响应中的 `<think>` 标签

流式数据处理实战&#xff1a;用状态机 scan 优雅过滤 AI 响应中的 <think> 标签 1. 引言&#xff1a;流式数据处理的挑战 在现代 AI 应用开发中&#xff0c;流式 API&#xff08;如 OpenAI、Claude 等&#xff09;能实时返回分块数据&#xff0c;提升用户体验。但流式…

【实时Linux实战系列】硬件中断与实时性

在实时系统中&#xff0c;硬件中断是系统响应外部事件的关键机制之一。硬件中断允许系统在执行任务时被外部事件打断&#xff0c;从而快速响应这些事件。然而&#xff0c;中断处理不当可能会导致系统延迟增加&#xff0c;影响系统的实时性。因此&#xff0c;优化中断处理对于提…

基于DTLC-AEC与DTLN的轻量级实时语音降噪系统设计与实现

基于DTLC-AEC与DTLN的轻量级实时语音降噪系统设计与实现 1. 引言 在当今的实时通信应用中,语音质量是影响用户体验的关键因素之一。环境噪声和回声会严重降低语音清晰度,特别是在移动设备和嵌入式系统上。本文将详细介绍如何将两种先进的开源模型——DTLC-AEC(深度学习回声…

基于Hadoop与LightFM的美妆推荐系统设计与实现

文章目录有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主项目介绍总结每文一语有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主 项目介绍 本项目旨在基于大数据Hadoop平台和机器学习技术&#xff0c;构建一套面向美妆…

notepad++ 多行复制拼接

如何将中文一 一复制到英文后面按住 ALT ,鼠标左键拖动多行选中中文Ctrl C 复制 在英文的第一行结尾处 Ctrl v 粘贴

【前沿技术动态】【AI总结】Spring Boot 4.0 预览版深度解析:云原生时代的新里程碑

Spring Boot 4.0 预览版深度解析&#xff1a;云原生时代的新里程碑 最低 Java 17&#xff0c;原生支持虚拟线程&#xff0c;性能提升最高800%&#xff0c;Spring Boot 4.0 带来开发体验与运行时性能的全面飞跃 Spring Boot 4.0 的预览版在2025年5月底悄然上线&#xff0c;标志着…

OkHttp 框架封装一个 HTTP 客户端,用于调用外部服务接口

✅ 背景与需求 需要基于 OkHttp 框架封装一个 HTTP 客户端&#xff0c;用于调用外部服务接口&#xff08;如拼团回调&#xff09;&#xff0c;实现以下功能&#xff1a; 动态传入请求地址&#xff08;URL&#xff09;支持 JSON 请求体实现类放在 infrastructure 层的 gateway…

使用Collections.max比较Map<String, Integer>中的最大值

文章目录使用Collections.max比较Map<String, Integer>中的最大值基本方法1. 比较Map的值2. 比较Map的键自定义比较器1. 按值降序排列2. 复杂比较逻辑完整示例代码性能考虑替代方案1. 使用Stream API (Java 8)2. 手动遍历实际应用场景注意事项总结使用Collections.max比较…

鸿蒙状态栏操作

1.鸿蒙设备基础信息 1.1图解 1.1窗口内容规避区域 AvoidArea7 窗口内容规避区域。 窗口内容规避区域。如系统栏区域、刘海屏区域、手势区域、软键盘区域等与窗口内容重叠时&#xff0c;需要窗口内容避让的区域。在规避区无法响应用户点击事件。 除此之外还需注意规避区域的如…

Product Hunt 每日热榜 | 2025-07-17

1. Brain MAX by ClickUp 标语&#xff1a;一款AI应用统治一切&#xff1a;你的知识 语音转文字 介绍&#xff1a;Brain MAX 是 ClickUp 完全原生的桌面应用&#xff0c;旨在提升生产力&#xff0c;帮助你摆脱 AI 的杂乱无章。只需每月 9 美元&#xff0c;就可以使用所有的 …

如何使用VScode使用ssh连接远程服务器不需要输入密码直接登录

ssh-keygen 之后一直默认 回车 确认即可结果 (base) amaxamax:/data/std$ ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/home/amax/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again:…

vue实现el-table-column中自定义label

vue实现el-table-column中自定义label<el-table-columnlabel"操作"align"left"width"50"><template #header><div><el-buttonsize"mini"type"primary"icon"el-icon-plus"circle></el-…

Vue 常用的 ESLint 规则集

对Vue项目来说&#xff0c;Vue 官方通过 eslint-plugin-vue 提供了多个规则集&#xff08;Rule Sets&#xff09;&#xff0c;适用于不同严格度和 Vue 版本。以下是主要的规则集及其对应的 ESLint 插件和用途&#xff1a; 1. Vue 2.x 规则集 适用于 Vue 2 项目&#xff0c;规则…

AbMole小课堂 | Angiotensin II(血管紧张素Ⅱ)在心血管研究中的多元应用

Angiotensin II&#xff08;血管紧张素Ⅱ&#xff0c;AbMole&#xff0c;M6240&#xff09;是一种血管收缩剂&#xff0c;也是肾素-血管紧张素系统 (RAS) 的主要效应肽。Angiotensin II参与动物的血压调节、水电解质平衡等经典生理过程在科研中Angiotensin II被广泛用于动物心血…

【Unity】Mono相关理论知识学习

一种编译技术。优点&#xff1a;支持JIT编译&#xff1a;在运行时将IL编译成机器码。首次执行稍慢&#xff0c;好处在于运行更快&#xff0c;迭代更高效。构建速度快&#xff1a;无需将IL转成C&#xff0c;构建过程省去了IL2CPP的转换和原生编译步骤&#xff0c;适合开发阶段快…

React源码4 三大核心模块之一:Schedule,scheduleUpdateOnFiber函数

scheduler工作阶段在React内部被称为schedule阶段。在《React源码3》&#xff0c;我们已经将update加入队列并返回到了根容器节点root。function updateContainer(element, container, parentComponent, callback) {//前面略过var root enqueueUpdate(current$1, update, lane…

Unity3D + VS2022连接雷电模拟器调试

本文参考了Unity3D Profiler 连接真机和模拟器_unity 连接雷电模拟器-CSDN博客 具体步骤&#xff1a; 1、cmd打开命令窗口&#xff0c;输入adb devices&#xff0c;确认能检测到模拟器 示例&#xff1a;List of devices attached emulator-5554 device 2、…

学习软件测试的第十五天

1.会写测试用例吗&#xff1f;测试用例有什么要素“会的&#xff0c;我写过多个功能测试和接口测试的测试用例。我写用例的时候会根据需求文档或原型图分析测试点&#xff0c;然后从正常流程、异常流程、边界情况等方面设计测试场景。每条用例我都会包含&#xff1a;用例编号、…