当前位置: 首页 > 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 ----------…...

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化&#xff1a;人工智能的自我改进与监管挑战 文章目录 递归进化&#xff1a;人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管&#xff1f;3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

使用分级同态加密防御梯度泄漏

抽象 联邦学习 &#xff08;FL&#xff09; 支持跨分布式客户端进行协作模型训练&#xff0c;而无需共享原始数据&#xff0c;这使其成为在互联和自动驾驶汽车 &#xff08;CAV&#xff09; 等领域保护隐私的机器学习的一种很有前途的方法。然而&#xff0c;最近的研究表明&…...

EtherNet/IP转DeviceNet协议网关详解

一&#xff0c;设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络&#xff0c;本网关连接到EtherNet/IP总线中做为从站使用&#xff0c;连接到DeviceNet总线中做为从站使用。 在自动…...

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec&#xff1f; IPsec VPN 5.1 IPsec传输模式&#xff08;Transport Mode&#xff09; 5.2 IPsec隧道模式&#xff08;Tunne…...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;社区养老保险系统小程序被用户普遍使用&#xff0c;为方…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)

漏洞概览 漏洞名称&#xff1a;Apache Flink REST API 任意文件读取漏洞CVE编号&#xff1a;CVE-2020-17519CVSS评分&#xff1a;7.5影响版本&#xff1a;Apache Flink 1.11.0、1.11.1、1.11.2修复版本&#xff1a;≥ 1.11.3 或 ≥ 1.12.0漏洞类型&#xff1a;路径遍历&#x…...

MySQL的pymysql操作

本章是MySQL的最后一章&#xff0c;MySQL到此完结&#xff0c;下一站Hadoop&#xff01;&#xff01;&#xff01; 这章很简单&#xff0c;完整代码在最后&#xff0c;详细讲解之前python课程里面也有&#xff0c;感兴趣的可以往前找一下 一、查询操作 我们需要打开pycharm …...

基于鸿蒙(HarmonyOS5)的打车小程序

1. 开发环境准备 安装DevEco Studio (鸿蒙官方IDE)配置HarmonyOS SDK申请开发者账号和必要的API密钥 2. 项目结构设计 ├── entry │ ├── src │ │ ├── main │ │ │ ├── ets │ │ │ │ ├── pages │ │ │ │ │ ├── H…...

数据结构第5章:树和二叉树完全指南(自整理详细图文笔记)

名人说&#xff1a;莫道桑榆晚&#xff0c;为霞尚满天。——刘禹锡&#xff08;刘梦得&#xff0c;诗豪&#xff09; 原创笔记&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 上一篇&#xff1a;《数据结构第4章 数组和广义表》…...