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

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提示覆盖索引前缀索引设计原则索引 概述 索引&#xf…...

【前端】进阶Mac OS软件商城页面_缤纷多彩的创意UI

非常漂亮的仿Mac OS界面&#xff0c;更改下参数就可以变成你需要的界面。 还可以一键更换背景主题 灵感来源于米科瓦伊加文齐奥夫斯基 附上css、html、js源码 下面是html文件 <!DOCTYPE html> <html lang"en" > <head><meta charset"…...

格创东智与金羽新能合作|先进工业互联网助力固态电池智能化运营

2022年12月&#xff0c;浙江金羽新能源科技有限公司&#xff08;以下简称金羽新能&#xff09;与格创东智签订战略合作框架协议&#xff0c;并在湖州安吉举行金羽新能固态电池MES项目启动会。 固态电池是一种使用固体电极和固体电解质的电池。相较传统锂电池&#xff08;液态电…...

软件测试面试刷题app包含了各种难题

软件测试的生命周期&#xff1a; V模型&#xff1a;与软件开发阶段呼应 软件开发&#xff1a;需求分析-->概要设计-->详细设计-->编码阶段软件测试&#xff1a;单元测试-->集成测试-->系统测试-->验收测试从基本流程的角度讲&#xff1a; 需求阶段&#xff…...

19、ClickHouse企业中常见的20种用法

文章目录19、ClickHouse企业中常见的20种用法-- 1、表结构添加字段-- 2、删除语句-- 3、更新语法-- 4、查询表字段结构-- 5、展示字段加密处理 身份证号&#xff08;字母加数字&#xff09;加密-- 6、展示字段加密处理 手机号&#xff08;纯数字&#xff09;加密-- 7、计数 去重…...

怎么样用香港主机搭建游戏网站

香港是全球主要的互联网骨干节点&#xff0c;拥有质量较高的网络基础设施&#xff0c;在网络速度和稳定性方面表现良好。因此&#xff0c;使用香港主机搭建游戏网站可以使用户在游戏中的体验流畅且基本不会延迟情况。本文将向用户解释如何使用香港主机搭建游戏网站。在搭建游戏…...

重磅!GitLab 提出五大预测,洞见 2023 年 DevSecOps 发展趋势

本文来源&#xff1a;about.gitlab.com 作者&#xff1a;Sandra Gittlen 译者&#xff1a;极狐(GitLab) 市场部内容团队 2023 年&#xff0c;企业会将更多的时间和资源投入到持续的安全左移上&#xff0c;完成从 DevOps 到 DevSecOps 的演变。 GitLab CMSO Ashley Kramer 表示…...

内核模块(传参和依赖)

目录 一、模块传参 二、模块依赖 三、内核空间和用户空间 四、执行流 五、模块编程与应用编程的比较 六、内核接口头文件查询 七、小作业 一、模块传参 module_param(name,type,perm);//将指定的全局变量设置成模块参数 name:全局变量名 type&#xff1a; 使用符号 …...

基础篇:03-SpringCloud工程部署启动

目录 1.工程搭建部署 方案一&#xff1a;完整工程导入 方案二&#xff1a;从零开始搭建 1.工程与module创建 2.数据库导入 3.项目启动 3.1 启动并访问user-service 3.2 启动并访问order-service 4.服务远程调用 时序图说明 服务远程调用实现 注入RestTemplate Res…...

二、产品经理——【需求收集】【需求管理】

0. 学习目标 能够理解并描述需求能够收集并管理需求 1. 如何定义需求 1.1. 需求的定义 原始需求&#xff1a;没有经过任何分析&#xff0c;或者没有经过任何额外解读的需求信息 避免日后纠纷&#xff0c;尽量记录一下原始需求&#xff01;先记录下来&#xff0c;后面再进行分…...

蓝桥杯stm32 USART 串口接收数据

文章代码使用 HAL 库。 文章目录 前言一、创建 CubeMX 工程:二、 中断接收数据 函数:三、串口接收回调函数实验效果四、接收固定长度的数据。五、串口接收 不定长数据。总结前言 上篇文章是 串口的发送数据,这篇文章接着上次的 讲 串口的接受数据。 一、创建 CubeMX 工程:…...

CellularAutomata元胞向量机-9-生命游戏MATLAB代码分享

主程序&#xff1a;%%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, 需…...

力扣-组合两个表

大家好&#xff0c;我是空空star&#xff0c;本篇带你了解一道简单的力扣sql练习题。 文章目录前言一、题目&#xff1a;175. 组合两个表二、解题1.left join提交SQL运行结果2.right join提交SQL运行结果总结前言 一、题目&#xff1a;175. 组合两个表 表: Person ----------…...

Linux权限概念

目录 Linux权限的概念 什么是权限 如何去操作权限 设置文件所属角色 设置文件属性 umask 粘滞位 Linux权限的概念 首先我们要了解到&#xff0c;在linux下有两种用户&#xff1a;超级用户(root)和普通用户。超级用户的命令提示符是“#”&#xff0c;普通用户的命令提示…...

备战金三银四,这些无数测试前辈们踩过的坑,在面试中,一定要注意这些

你觉得软件测试师这个职位怎么样&#xff1f;大多数人可能会给出答案:“测试&#xff1f;啊&#xff0c;没有技术含量。无非是看需求、业务手册、设计文档&#xff0c;然后点击功能是否实现。问题是测试中的部署和安装是否存在兼容性问题。” 是的&#xff0c;不可否认&#x…...

注解(加与不加的区别)

起因&#xff1a; 在看到这个文章时&#xff0c;对于注解的作用半知半解&#xff0c;由此&#xff0c;写了个例子&#xff0c;验证注解作用 以Override举例 新建一个父类&#xff0c;取名为textone(类名首字母应该大写) 写一个方法&#xff1a; 再新建一个类&#xff0c;继承…...

小众免费的短视频素材库

推荐5个小众但好用的视频素材网站&#xff0c;免费可商用&#xff0c;视频剪辑、自媒体必备~ 1、菜鸟图库 https://www.sucai999.com/video.html?vNTYxMjky ​ 菜鸟图库网素材非常丰富&#xff0c;网站主要还是以设计素材为主&#xff0c;高清视频素材也很多&#xff0c;像风…...

docker-compose安装SonarQube

前言SonarQube 是一个开源的代码分析平台, 用来持续分析和评测项目源代码的质量。 通过SonarQube我们可以检测出项目中重复代码&#xff0c; 潜在bug&#xff0c; 代码规范&#xff0c;安全性漏洞等问题&#xff0c; 并通过SonarQube web UI展示出来。一、docker-compose配置#v…...

《数字经济全景白皮书》金融篇:五十弦翻塞外声,金融热点领域如何实现增长?

易观分析&#xff1a;《数字经济全景白皮书》浓缩了易观分析对于数字经济各行业经验和数据的积累&#xff0c;并结合数字时代企业的实际业务和未来面临的挑战&#xff0c;以及数字技术的创新突破等因素&#xff0c;最终从数字经济发展大势以及各领域案例入手&#xff0c;帮助企…...

微服务门神-Gateway与Sentinel的集成

目录 引言 概述 集成Sentinel 限流维度 网关集成 Route维度 API分组 精准匹配 前缀匹配 正则匹配 自定义限流返回格式 转视频版 引言 书接上篇&#xff1a;微服务门神-Gateway过滤器Filter&#xff0c;讲完了解Gateway过滤器之后&#xff0c;接下来看下Gateway与…...

查找的基本概念

查找表是由同一类型的数据元素&#xff08;或记录&#xff09;构成的集合。根据给定的某个值&#xff0c;在查找表中确定一个其关键字等于给定值的数据元素或记录。关键字&#xff1a;用来标识一个数据元素&#xff08;或记录&#xff09;的某个数据项的值。查找算法的评价指标…...

安装v-router出错

一、场景 1、安装v-router npm i --save vue-router 2、报错&#xff1a; npm ERR! code ERESOLVE npm ERR! ERESOLVE unable to resolve dependency tree npm ERR! npm ERR! While resolving: sph20.1.0 npm ERR! Found: vue2.7.14 npm ERR! node_modules/vue npm ERR! v…...

2023美赛C题:预测 Wordle 结果

以下内容全部来自本人人工翻译&#xff0c;仅供参考。 文章目录背景要求附件数据文件条目描述纽约时报网站上发布的Wordle指导方针词汇表参考文献服务背景 Wordle是目前纽约时报每天提供的一种受欢迎的谜题。玩家试图通过在六次或更少的机会内猜测一个五个字母的单词来解决谜题…...

网站关键词优化怎么做/网站开发培训

本文以实例形式介绍了python turtle模块即海龟绘图的使用方法&#xff0c;对于需要进行图形编程的朋友相信会有一定的借鉴价值。python turtle模块简介&#xff1a;python2.6版本中引入的一个简单的绘图工具&#xff0c;叫做海龟绘图(Turtle Graphics)1.使用海龟绘图首先我们需…...

自己做网站怎么做/淘宝seo推广优化

□紫金山/金陵晚报记者 陈曦 2019年江苏省信息与未来小学生夏令营活动总决赛日前举行&#xff0c;全省各市共有300余名选手参加&#xff0c;南外仙林小学部学生在信息学竞赛中勇夺全省团体总分第一。南外仙林小学部一直重视编程&#xff08;信息学&#xff09;这门学科的建设&…...

做网站怎么单独写手机页面/网站制作流程和方法

目前的APP基本都支持二维码扫描下载&#xff0c;二维码下载也成为了大家用起来很顺手的一种方式。由于微信的用户基本占据了国内市场的90%&#xff0c;说到扫一扫用户第一个想到的就是打开微信扫一下&#xff0c;通过微信分享APP&#xff0c;再从分享的链接下载apk/ios包。故用…...

网站静态页面下载工具/百度站点

线性表可能被当成数组乱用&#xff01; 数组类创建的意义&#xff0c;就是替代C原生数组&#xff01; #ifndef ARRAY_H #define ARRAY_H#include "Object.h" #include "Exception.h"namespace DragonLib {template <typename T> class Array : …...

广州手机网站建设报价表/刷赞网站推广永久

数列求和(1).1^4+2^4+3^4+.+n^4 (2).1^5+2^5+3^5+.+n^5 以下证明利用到:1^2+2^2+3^2+……+n^2=n(n+1)(2n+1)/6和1^3+2^3+3^3+……+n^3=[n(n+1)/2]^2;证明:(1)2^5=(1+1)^5=1^5+51^4+101^3+101^2+51^1+13^5=(2+1)^5=2^5+52^4+102^3+102^2+52^1+1……(n+1)^5=n^5+5n^4+10n^3…...

做绿色软件的网站知乎/软文推广营销服务平台

to&#xff1a;zhangsan from:李四 address:山东 HTTP: 通信双方如果想要通信就必须遵循一定的规则&#xff0c;我们把这个规则称之为HTTP协议&#xff01; 报文&#xff1a; HTTP协议通信的内容我们称之为报文 报文格式&#xff1a; 报文首部 空行 报文主体 请求…...