Python学习-----函数3.0(嵌套函数、闭包、装饰器)
目录
1.函数嵌套
2.闭包
3.装饰器
这一节,我会详细Python中讲解函数的进阶内容,包括嵌套函数、闭包和装饰器。一起来学习吧!!!
1.函数嵌套
概念:函数里面再定义一个函数
作用:当我们在一个多功能的函数里面想把这些功能进一步去拆分为多个子模块,但是又觉得这些子模块放到全局的话会因为函数的名字冲突而影响程序的整体效果,这时候我们就需要去利用函数的嵌套,在函数里面去定义函数,然后再进行调用,这样可以提高代码的可读性(先定义后调用)
样式:
def fun1():def fun2():passdef fun3():pass
fun3()
fun3()
示例:
定义一个函数,输入一个数字,先判断这个数字是不是奇数,如果是的话就返回这个奇数的阶乘,如果不是的话就返回0
def fun(n):def judge():#判断是不是奇数if n%2==0:return Falseelse:return Truedef output(a):#获取上一个函数的返回值,如果是计算就返回计算的阶乘,否则返回0if a:sum=1for i in range(1,n+1):sum*=ireturn sumelse:return 0return output(judge())s=input('输入你的数字:')
print(fun(int(s)))
看!这个就是一个嵌套函数的代码,这让我们觉得这种写法非常明了,一个大模块函数里面包含了多个小模块函数,每个小模块有其相对应的功能,可读性很强,简洁明了。最最最重要的是这个函数里面的子函数名字是作为一个局部变量,完全不会影响到外面的全局变量,就算是外面有与子函数名字相同的变量,结果也是互不影响的。
2.闭包
前面我们都知道函数变量其实是一个具有函数功能的变量,其本质是一种变量类型,所以我们可以去实现函数变量的赋值,进而实现这个被赋值的变量具备了函数的功能,其实闭包就是巧妙地利用了这种关系而形成的一种方法。
在讲之前,先看个示例 :
def fun(time):print('o(* ̄︶ ̄*)o')print('全民制作人们,大家好')print('我是练习时长%s的个人练习生cxk'%time)user=fun
user('两年半')
#输出结果:
# o(* ̄︶ ̄*)o
# 全民制作人们,大家好
# 我是练习时长两年半的个人练习生cxk
概念:闭包,又称闭包函数或者闭合函数,是基于函数嵌套搞出来一个特殊嵌套。闭包中外部函数返回的不是一个具体的值,而是一个函数。一般情况下,返回的函数会赋值给一个变量,这个变量可以在后面被继续执行调用。
作用:获取保存外部函数的变量,不会因为这个变量随着函数的调用而销毁,然后把外部函数的变量用到内部函数去,最后返回内部函数
#闭包
def outside():a=100 #这个是一个临时变量,会随着函数被调用之后而销毁def inside(b):c=a+bprint(f'输出{c}',end='')return inside #注意,这里是返回这个函数的变量名,而不是返回整个函数my=outside()
my(9) #此时变量 my 已经具备了inside() 这个函数的功能
#输出结果:输出109
这个就是很简单的闭包形式,在内函数中利用了外函数的临时变量,同时还具备内函数的功能,最后返回这个内函数变量名字,当我们要去获取这类功能的变量时,我们就可以去直接定义一个变量等于这个outside()函数,以后做项目的时候会经常用到闭包的。
3.装饰器
在讲之前,我先讲一个例子可以帮助我们更好地理解装饰器:当我看到小美有一顶可爱的小白兔 帽子,这时候我也想买跟她一样的帽子去戴到头上,这时候我会去问小美哪里可以买到这顶帽子,这时候小美会告诉我她买的地方,我就会去那个地方买;同样当我买了帽子之后,小叶看到我买了这个帽子,她也会问我去那里买,我也很同样去告诉她……其实这个帽子就可以理解为一个装饰器,而卖帽子的地方可以去看做一个产生装饰器的代码。
概念:本质就是一个函数 , 是一个特殊的闭包,也是函数嵌套的一种表现形式
作用:就是在不修改源代码的前提下,对原有的函数增加新的功能。遵循封闭开放原则:对修改源代码的的操作封闭 , 对增加新的功能的操作开放
限制与统计:
1.不可以修改已有的代码功能
2.不可以修改已有的函数调用方式
3.给一个已有函数增加额外的功能
装饰器与闭包函数区别:
装饰器本质上是一个闭包函数,但是装饰器有且仅有一个参数,同时这个参数的类型还必须是函数类型,这样才满足装饰器的条件,否则那就不是装饰器,而是一个闭包函数
先来看看几个例子:
非装饰器原型(具有装饰器功能):
def out(q): #参数q是一个函数类型的参数def inside():q() #执行这个函数print('fuck')return q() #最后再次返回这个函数再次执行return inside #外函数返回内层函数def kun():print('蔡徐坤')print('只因')a=out(kun)
a()
你们可以去自行看代码,试着想一下结果

以上就是结果,这里可能会有些人觉得懵懵的。这个其实就是装饰器的一个功能原型(但非装饰器),首先是在out()函数传入一个函数类型,然后进入到内层函数来执行,所以我们就看内层函数,这个函数的执行顺序是先执行这个传入的函数,再去打印一个'fuck',然后返回这个传入的函数再次执行,所以结果就是这样而来的。
装饰器写法:
#装饰器的代码
def out(q): #参数q是一个函数类型的参数def inside():q() #执行这个函数print('fuck')return q() #最后再次返回这个函数再次执行return inside #外函数返回内层函数
@out #装饰器的使用,等效于kun=out(kun) 即kun=inside,后面直接去使用就行了
def kun():print('蔡徐坤')print('只因')kun()#直接调用这个已经被装饰好了的函数

out()函数就是一个装饰器的代码,当我们要去装饰函数的时候就直接去艾特@就行了,这时候这个函数会传入到装饰器里面去,然后进入到内层函数进行相对应的功能,自然,输出结果也是一样的。
带参数的装饰器
请写一个装饰器可以实现一个带参数的加法函数,然后给每个参数增加阶乘功能,最后返回这些参数阶乘的和
比如:输入 4 和 5
输出:4!+5!的结果
def out(q): #参数q是一个带参数的函数类型的参数def inside(a,b): #内层函数需要传入被装饰函数的参数值,不然无法在下面去调用这个函数sum1=1#a的阶乘sum2=1#b的阶乘for i in range(1,a+1):sum1*=ifor j in range(1,b+1):sum2*=jq(sum1,sum2)#这里就调用了加法函数,然后输出sum1和sum2的和return inside
@out #等效于kun=out(kun) 即kun=inside,要用的时候就直接去调用就行了
def kun(a,b):c=a+bprint(c)a=int(input('num1:'))
b=int(input('num2:'))
kun(a,b)
这个就是带有参数的装饰器,要注意好参数的类型以及位置,当我们要在传上去里面去传入参数的时候就得取出要装饰的参数部分与之相对应。
在Python中,装饰器的功能是非常强大的,我们去定义函数的时候可以通过装饰器来给这个函数来添加功能,完全不需要去定义另一个函数来实现这些功能,而且装饰器还可以多次使用,随取随用。
送一张壁纸~~

相关文章:
Python学习-----函数3.0(嵌套函数、闭包、装饰器)
目录 1.函数嵌套 2.闭包 3.装饰器 这一节,我会详细Python中讲解函数的进阶内容,包括嵌套函数、闭包和装饰器。一起来学习吧!!! 1.函数嵌套 概念:函数里面再定义一个函数 作用:当我们在一个多…...
最新版EasyRecovery数据恢复软件使用测评介绍
我们在逐渐适应信息电子化的同时,也有一些潜在的麻烦接踵而来,其中较为常见的就是文件和数据的保存问题。显然,设备的存储空间是有限的,这就不可避免地会出现数据被删除、覆盖或丢失的现象,如果丢失的是重要数据&#…...
关于知识图谱TransR
论文题目 Learning Entity and Relation Embeddings for Knowledge Graph Completion 论文链接 TransR 文中指出,不管是TransE还是TransH都是将实体和关系映射同一空间,但是,一个实体可能具有多个层面的信息,不同的关系可能关注…...
始于日志,不止于日志,Elastic Stack全面介绍
1、Elastic Stack是什么? 说Elastic Stack之前,先说一下ELK Stack。这个词相信很多人都是耳熟能详的,作为一个著名的日志系统解决方案,应用非常广泛。 “ELK”是三个开源项目的首字母缩写词:Elasticsearch、Logstash…...
FDX-B|EMID格式低频RFID 读卡模块LD6900技术选型与说明
FDX-B|EMID格式低频RFID 读卡模块LD6900是华翔天诚推出一款基于 RFID 无线射频识别技术的低频(LF)读卡模块,工作频率支持 134.2KHZ、125KHZ,符合 ISO 11784/5 国际标准,支持对 FDX-B、EMID 两种协议格式电子标签的读取…...
《SQL基础》11. 索引
SQL - 索引索引概述结构B-TreeBTreeHash思考分类语法SQL性能分析SQL执行频率慢查询日志profile详情explain执行计划索引失效情况范围查询索引列运算字符串不加引号模糊查询or连接条件数据分布影响使用规则最左前缀法则SQL提示覆盖索引前缀索引设计原则索引 概述 索引…...
【前端】进阶Mac OS软件商城页面_缤纷多彩的创意UI
非常漂亮的仿Mac OS界面,更改下参数就可以变成你需要的界面。 还可以一键更换背景主题 灵感来源于米科瓦伊加文齐奥夫斯基 附上css、html、js源码 下面是html文件 <!DOCTYPE html> <html lang"en" > <head><meta charset"…...
格创东智与金羽新能合作|先进工业互联网助力固态电池智能化运营
2022年12月,浙江金羽新能源科技有限公司(以下简称金羽新能)与格创东智签订战略合作框架协议,并在湖州安吉举行金羽新能固态电池MES项目启动会。 固态电池是一种使用固体电极和固体电解质的电池。相较传统锂电池(液态电…...
软件测试面试刷题app包含了各种难题
软件测试的生命周期: V模型:与软件开发阶段呼应 软件开发:需求分析-->概要设计-->详细设计-->编码阶段软件测试:单元测试-->集成测试-->系统测试-->验收测试从基本流程的角度讲: 需求阶段ÿ…...
19、ClickHouse企业中常见的20种用法
文章目录19、ClickHouse企业中常见的20种用法-- 1、表结构添加字段-- 2、删除语句-- 3、更新语法-- 4、查询表字段结构-- 5、展示字段加密处理 身份证号(字母加数字)加密-- 6、展示字段加密处理 手机号(纯数字)加密-- 7、计数 去重…...
怎么样用香港主机搭建游戏网站
香港是全球主要的互联网骨干节点,拥有质量较高的网络基础设施,在网络速度和稳定性方面表现良好。因此,使用香港主机搭建游戏网站可以使用户在游戏中的体验流畅且基本不会延迟情况。本文将向用户解释如何使用香港主机搭建游戏网站。在搭建游戏…...
重磅!GitLab 提出五大预测,洞见 2023 年 DevSecOps 发展趋势
本文来源:about.gitlab.com 作者:Sandra Gittlen 译者:极狐(GitLab) 市场部内容团队 2023 年,企业会将更多的时间和资源投入到持续的安全左移上,完成从 DevOps 到 DevSecOps 的演变。 GitLab CMSO Ashley Kramer 表示…...
内核模块(传参和依赖)
目录 一、模块传参 二、模块依赖 三、内核空间和用户空间 四、执行流 五、模块编程与应用编程的比较 六、内核接口头文件查询 七、小作业 一、模块传参 module_param(name,type,perm);//将指定的全局变量设置成模块参数 name:全局变量名 type: 使用符号 …...
基础篇:03-SpringCloud工程部署启动
目录 1.工程搭建部署 方案一:完整工程导入 方案二:从零开始搭建 1.工程与module创建 2.数据库导入 3.项目启动 3.1 启动并访问user-service 3.2 启动并访问order-service 4.服务远程调用 时序图说明 服务远程调用实现 注入RestTemplate Res…...
二、产品经理——【需求收集】【需求管理】
0. 学习目标 能够理解并描述需求能够收集并管理需求 1. 如何定义需求 1.1. 需求的定义 原始需求:没有经过任何分析,或者没有经过任何额外解读的需求信息 避免日后纠纷,尽量记录一下原始需求!先记录下来,后面再进行分…...
蓝桥杯stm32 USART 串口接收数据
文章代码使用 HAL 库。 文章目录 前言一、创建 CubeMX 工程:二、 中断接收数据 函数:三、串口接收回调函数实验效果四、接收固定长度的数据。五、串口接收 不定长数据。总结前言 上篇文章是 串口的发送数据,这篇文章接着上次的 讲 串口的接受数据。 一、创建 CubeMX 工程:…...
CellularAutomata元胞向量机-9-生命游戏MATLAB代码分享
主程序:%%Conways life with GUI clf % 清除图形clc, clear% %build the GUI %define the plot button plotbuttonuicontrol(style,pushbutton,... string,Run, ... fontsize,12, ... position,[100,400,50,20], ... callback, run1;); %define the stop button era…...
基于Java+Swing+mysql图书管理系统
基于JavaSwingmysql图书管理系统一、系统介绍二、功能展示1.用户登陆、注册2.类别管理--管理员3.图书管理--管理员4.用户管理--管理员5.图书借还情况查看--管理员7.用户主页8.办理还书--用户9.办理还书三、数据库四、其它系统五、获取源码一、系统介绍 该系统实现了 用户: 图书…...
高通IPQ支持串口转RS485
IPQ60xx支持串口转RS485 1. IPQ6018支持串口转RS4851.1 功能需求1.2 原理1.3 实现方法1.4 如何使用RS485?1.5 修改底层串口驱动来进行控制收发状态,上层应用可以直接当成串口来进行操作1. IPQ6018支持串口转RS485 1.1 功能需求 IPQ60xx/IPQ501x/IPQ80xx项目中使用RS485, 需…...
力扣-组合两个表
大家好,我是空空star,本篇带你了解一道简单的力扣sql练习题。 文章目录前言一、题目:175. 组合两个表二、解题1.left join提交SQL运行结果2.right join提交SQL运行结果总结前言 一、题目:175. 组合两个表 表: Person ----------…...
【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...
12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...
计算机基础知识解析:从应用到架构的全面拆解
目录 前言 1、 计算机的应用领域:无处不在的数字助手 2、 计算机的进化史:从算盘到量子计算 3、计算机的分类:不止 “台式机和笔记本” 4、计算机的组件:硬件与软件的协同 4.1 硬件:五大核心部件 4.2 软件&#…...
