学习python仅收藏此一篇就够了(闭包,装饰器)

闭包

在函数嵌套的前提下,内部函数使用了外部函数的变量,并且外部函数返回了内部函数,我们把这个使用外部函数变量的内部函数称为闭包。

简单闭包

内部函数使用外部变量

def outer(name):def inner(name1):print(f"<{name}><{name1}><{name}>")return innerf1 = outer("wyx")
f1("sxx")f2 = outer("sx")
f2("wyx")
<wyx><sxx><wyx>
<sx><wyx><sx>

nonlocal关键字

如果需要修改外部函数变量的值,需要使用nonlocal关键字修饰外部函数的变量才可以在内部函数中修改它。

def outer(num1):def inner(num2):nonlocal num1num1 += num2print(num1)return innerfn = outer(10)
fn(10) #20
fn(10) #30
account = 0
def atm(num, deposit=True):global accountif deposit:account += numprint(f"存款+{num},余额{account}")else:account -= numprint(f"取款-{num},余额{account}")atm(300)
atm(100, False)
存款+300,余额300
取款-100,余额200#使用闭包实现
def account(amount=0):def atm(num, deposit=True):nonlocal amountif deposit:amount += numprint(f"存款+{num},余额{amount}")else:amount -= numprint(f"取款-{num},余额{amount}")return atmatm = account()
atm(100)
atm(200)
存款+100,余额100
存款+200,余额300

注意事项:

优点,使用闭包可以让我们得到:

  • 无需定义全局变量即可实现通过函数,持续的访问,修改某个值

  • 闭包使用的变量的所用于在函数内,难以被错误的调用修改

缺点:

  • 由于内部函数持续引用外部函数的值,所以会导致这一部分内存空间不被释放,一直占用内存

装饰器

装饰器其实也是一种闭包,其功能就是在不破坏目标函数原有的代码和功能的前提下,为目标函数增加新功能。

def outer(func):def inner():print("我要睡觉了")func()print("我要起床了")return innerdef sleep():import randomimport timeprint("睡眠中。。")time.sleep(random.randint(1,4))fn = outer(sleep)
fn()
我要睡觉了
睡眠中。。
我要起床了

装饰器的语法糖写法

使用@outer定义在目标函数sleep之上

def outer(func):def inner():print("我要睡觉了")func()print("我要起床了")return inner@outerdef sleep():import randomimport timeprint("睡眠中。。")time.sleep(random.randint(1,4))sleep()

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

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

相关文章

x-cmd pkg | aliyun - 阿里云 CLI

目录 简介首次用户技术特点竞品和相关作品进一步阅读 简介 aliyun 是基于阿里云 OpenAPI 的管理工具&#xff0c;用于与阿里云服务交互&#xff0c;管理阿里云资源。 首次用户 使用 x env use aliyun 即可自动下载并使用 在终端运行 eval "$(curl https://get.x-cmd.com…

Jetson之路

119换源之觞&#xff1a;版本一定要对耶耶耶&#xff01;所有问题解决&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;Ubuntu20.04 错误提醒&#xff1a;无法修正错误_aptitude : 依赖: libapt-pkg5.0 (> 1…

(初研) Sentence-embedding fine-tune notebook

由于工作需要&#xff0c;需要对embedding模型进行微调&#xff0c;我调用了几种方案&#xff0c;都比较繁琐。先记录一个相对简单的方案。以下内容并不一定正确&#xff0c;请刷到的大佬给予指正&#xff0c;不胜感激&#xff01;&#xff01;&#xff01; 一.对BGE模型&…

qt学习:实战 读取txt文件+定时器点名

目录 目标 步骤 头文件 配置ui界面 在.h里定义槽函数和字符串链表和定时器指针 在构造函数里读取txt文件并初始化定时器 开始按钮点击函数 开始定时器 停止按钮点击函数 关闭定时器 定时器槽函数 目标 两个按钮&#xff0c;一个开始点名&#xff0c;一个停止点名一个…

字符串倒序输出

近期面试有这样一个问题&#xff0c;给定一个字符串&#xff0c;将其倒序输出&#xff0c;这种问题乍一看很好处理&#xff0c;但是实际在写的时候不知道怎么写了&#xff0c;有思路&#xff0c;但是没写出来。记录一下。 字符串反转实现的方式有多种&#xff0c;本质思想是将两…

HTML动态房屋装饰特效

下面是代码&#xff1a; <!DOCTYPE html> <html lang"en" ><head><meta charset"UTF-8"><title>HTML5房屋装饰工具DEMO演示</title><link rel"stylesheet" href"css/style.css"></he…

数字化金融时代:探讨全球金融科技创新的最新动态

在当今数字化金融时代&#xff0c;金融科技创新如影随形&#xff0c;迅猛发展。本文将深入探讨全球范围内金融科技的最新动态&#xff0c;剖析各地新兴趋势与突破。从区块链技术的应用到人工智能在金融领域的崭露头角&#xff0c;我们将一一解读这个正在不断演变的金融科技画卷…

JavaScript 类型判断及类型转换规则

文章目录 JavaScript 类型及其判断使用 typeof 判断类型使用 instanceof 判断类型使用 constructor 和 Object.prototype.toString 判断类型JavaScript 类型及其转换JavaScript 函数参数传递cannot read property of undefined 问题解决方案分析一道网红题目JavaScript 类型判断…

Flutter轮播图Banner

使用插件&#xff1a;flutter_swiper 实现轮播图 pubspec.yaml 增加 &#xff1a;flutter_swiper : ^lastest_version 在项目文件夹下打开命令行执行&#xff1a;flutter packages get 安装插件 home_page.dart中使用swiper 程序运行:先启动虚拟设备后&#xff0c;执行命令f…

网络与系统安全期末复习

信息技术的发展趋势&#xff1a;融合、扩张、协作&#xff1b; 信息安全面临的挑战&#xff1a;隐私、身份、电子依赖、信任绑架、信息财富、边界模糊&#xff1b; 信息安全技术发展的四个阶段内在动力是什么&#xff1f; 保护技术&#xff1a;简单加密技术、存取控制技术、安…

算法训练 day24 | 77. 组合

77. 组合 题目链接:组合 视频讲解:带你学透回溯算法-组合问题 回溯其实和递归是密不可分的&#xff0c;解决回溯问题标准解法也是根据三部曲来进行的。 1、递归函数的返回值和参数 对于本题&#xff0c;我们需要用一个数组保存单个满足条件的组合&#xff0c;还需要另一个结果数…

【Qt5】QString的成员函数trimmed

2024年1月19日&#xff0c;周五下午 QString 的 trimmed 方法是用于移除字符串两端的空白字符&#xff08;空格、制表符、换行符等&#xff09;的方法。它返回一个新的字符串&#xff0c;该字符串是原始字符串去除两端空白后的结果。 下面是一个简单的示例&#xff1a; #incl…

开发语音产品时设计唤醒词和命令词的技巧

在实际开发语音产品过程中&#xff0c;要达到好的语音识别效果&#xff0c;除了语音算法要给力外&#xff0c;设计出好的唤醒词和命令词也能起到事倍功半的效果。所以下面介绍一下如何设计中文、英文和日文的唤醒词和命令词。 中文唤醒词设计 一般为4-6个字&#xff0c;4个字最…

setinel 阿里的限流方式

启动命令 java -jar sentinel-dashboard-1.8.1.jar --server.port8082 账号密码都是 sentinel 导入依赖 配置文件配置 spring:cloud:#限流sentinel:transport:#默认地址dashboard: localhost:8082 #配置security验证账号和密码security:user:name: adminpassword: admin #fe…

Nginx详细介绍(并从技术层面深度剖析)

nginx介绍 1.nginx 介绍2.nginx的优势3.Nginx VS Apache3.1.内核、语言、诞生时间比较3.2.功能比较3.3.Nginx 相对 apache 的优点 4.Nginx为什么有这么多的优势&#xff1f;4.1.IO多路复用&#xff08;I/O multiplexing【多并发】&#xff09;4.2.nginx的驱动模型介绍4.3.nginx…

初始js,js的变量

js起源 由布兰登&#xff0c;艾奇在1995年进行开发 JavaScript和ECMAScript的关系 ECMAScript &#xff08;简称“ES”&#xff09; 核心&#xff08; ECMAScript &#xff09;&#xff1a;提供语⾔的语法和基本对象 ⽂档对象模型&#xff08; DOM &#xff09;&#xff1…

削峰填谷与应用间解耦:分布式消息中间件在分布式环境下并发流量控制的应用

这是《百图解码支付系统设计与实现》专栏系列文章中的第&#xff08;18&#xff09;篇&#xff0c;也是流量控制系列的第&#xff08;4&#xff09;篇。点击上方关注&#xff0c;深入了解支付系统的方方面面。 本篇重点讲清楚分布式消息中间件的特点&#xff0c;常见消息中间件…

MiniTab的相关性统计

相关概述 相关可以度量两个变量之间关联的强度和方向。可以在以下两种相关方法之间进行选择&#xff1a;Pearson 积矩相关和 Spearman 秩次相关。Pearson 相关&#xff08;又称为 r&#xff09;是最常见的方法&#xff0c;它度量两个连续变量之间的线性关系。 如果变量之间的…

通讯录项目的实现以及动态顺序表(基于顺序表)

首先我们要知道什么是顺序表: 顺序表的底层结构是数组,对数组的封装,实现了常⽤的增删改查等接⼝,顺序表分为静态顺序表(使⽤定⻓数组存储元素)和动态顺序表(按需申请) 静态顺序表缺点: 空间给少了不够⽤,给多了造成空间浪费 拿出来我之前以及写好了的顺序表的代码:…

SQL SERVER无法连接到服务器解决过程记录

很久没用sql server了&#xff0c;这几天打算更新SQL SERVER数据库&#xff1a;SQL看这一篇就看够了&#xff08;附详细代码及截图&#xff09; 这篇文章&#xff0c;发现连接不上服务器。 找一下解决办法。 一、打开服务界面 在键盘上按“WINR”快捷键&#xff0c;打开运行…