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 ----------…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...
QT3D学习笔记——圆台、圆锥
类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...
jmeter聚合报告中参数详解
sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample(样本数) 表示测试中发送的请求数量,即测试执行了多少次请求。 单位,以个或者次数表示。 示例:…...
Qemu arm操作系统开发环境
使用qemu虚拟arm硬件比较合适。 步骤如下: 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载,下载地址:https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...
WebRTC从入门到实践 - 零基础教程
WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC? WebRTC(Web Real-Time Communication)是一个支持网页浏览器进行实时语音…...
