惬意上手Python —— 装饰器和内置函数

1. Python装饰器

 Python中的装饰器是一种特殊类型的函数,它允许用户在不修改原函数代码的情况下,增加或修改函数的行为。

具体来说,装饰器的工作原理基于Python的函数也是对象这一事实,可以被赋值给变量、作为参数传递给其他函数或者作为其他函数的返回值。装饰器通常接受一个函数作为输入,并返回一个新的函数,这个新函数通常会包含原函数的一些额外功能。

1.1 闭包 

闭包是一个函数与其相关的词法环境的结合,这使得该函数可以在外部作用域中访问本地于其创建环境的变量和参数。 

简单来说,闭包就是函数嵌套函数,内部函数可以使用外部函数的变量。下面是一个简单的示例。

def outer_function(x):def inner_function(y):return x + yreturn inner_functionclosure = outer_function(10)
print(closure(5))  # 输出 15

在这个例子中,outer_function是一个外部函数,它接受一个参数 x并返回一个内部函数inner_functioninner_function是一个闭包,因为它可以访问到其创建环境的变量x。当我们调用outer_function(10)时,它返回一个新的函数closure,这个函数可以访问到外部函数的变量x。然后我们调用closure(5),实际上就是调用inner_function(5),并将x的值设为10,因此最终输出结果为15。

1.2 Python装饰器

 

实现一个装饰器通常需要以下几个步骤:

  1. 定义装饰器函数:首先,我们需要定义一个装饰器函数,它接受一个函数作为参数,并返回一个新的函数。这个新的函数通常会包含原始函数的调用和一些额外的操作。
  2. 创建内部函数:在装饰器函数中,我们需要创建一个内部函数,它的作用是封装原始函数的调用和额外的操作。这个内部函数可以接收任意数量的参数和关键字参数,以便能够处理原始函数的调用。
  3. 调用原始函数:在内部函数中,我们首先调用原始函数,并将其结果保存到一个变量中。然后,我们可以对原始函数的结果进行一些额外的操作,例如修改、过滤或记录日志等。
  4. 返回新函数:最后,我们将内部函数返回为新的函数。这个新的函数将替代原始函数,并在被调用时执行内部函数的逻辑。
  5. 应用装饰器:一旦装饰器函数定义完成,我们就可以将其应用到需要装饰的函数上。这可以通过使用@语法来实现,或者通过显式地将装饰器函数作为参数传递给原始函数。
def my_decorator(func):def wrapper(*args, **kwargs):print("Before function call")result = func(*args, **kwargs)print("After function call")return resultreturn wrapper@my_decorator
def my_function():print("Inside function")my_function()

在这个例子中,my_decorator是一个装饰器函数,它接受一个函数作为参数并返回一个新的函数。这个新的函数被称为wrapper,它会在调用原始函数之前和之后执行一些额外的操作。

我们使用@my_decorator语法来应用装饰器到my_function函数上。当我们调用my_function()时,实际上是调用了wrapper()函数,并在其中执行了原始的my_function()函数。

输出结果:

Before function call
Inside function
After function call

 下面的代码是一个使用多个装饰器的代码,希望能帮助到你:

import timedef demo1(fun):def demo2():print("demo2中层开始")fun()time.sleep(2)print('睡了两秒,demo2中层结束')return demo2def demo3(fun):def demo4():print("demo4外层开始")start = time.time()fun()print("用时:", abs(start - time.time()))print("外层结束")return demo4@demo3
@demo1
def demo5():print("demo5内层开始")while True:if int(input("输入7,内层才会结束")) == 7:breakprint("内层结束")demo5()

输出结果:

demo4外层开始
demo2中层开始
demo5内层开始
输入7,内层才会结束1
输入7,内层才会结束2
输入7,内层才会结束7
内层结束
睡了两秒,demo2中层结束
用时: 14.538939952850342
外层结束

 在这个例子中,demo1demo3是两个装饰器,它们分别在demo5函数执行前后添加了一些打印语句和计时功能。demo5函数是一个无限循环,等待用户输入数字7才会结束。

这个函数被demo1demo3装饰器修饰后,会在执行前后添加额外的打印语句和计时功能。这样,当我们调用demo5函数时,实际上是在执行经过装饰后的函数,从而实现了在不修改原函数代码的情况下为其添加额外功能的目的。

当使用多个装饰器时,哪个装饰糖(就是带@的语句)离函数进,就先执行哪个。

其实说白了装饰就是添加功能,进入哪个装饰器,就会添加哪个装饰器内部函数的语句,这就叫装饰。

2. Python内置函数

Python中的聂志函数很多,不便一一解释,下面仅举几个常用的函数为例子。

1.len():计算字符串、列表、元组等长度。

s = "hello"
print(len(s))  # 输出:5

2.type():获取变量的类型。

a = 123
print(type(a))  # 输出:<class 'int'>

3.str():将其他类型的数据转换为字符串类型。

num = 123
print(str(num))  # 输出:"123"

4.list():将可迭代对象转换为列表类型。

tup = (1, 2, 3)
print(list(tup))  # 输出:[1, 2, 3]

 5.tuple():将可迭代对象转换为元组类型

lst = [1, 2, 3]
print(tuple(lst))  # 输出:(1, 2, 3)

6.dict():将键值对序列转换为字典类型。

items = [("key1", "value1"), ("key2", "value2")]
print(dict(items))  # 输出:{'key1': 'value1', 'key2': 'value2'}

7.set():将可迭代对象转换为集合类型。

lst = [1, 2, 3, 3]
print(set(lst))  # 输出:{1, 2, 3}

8.range():生成一个整数序列。

for i in range(5):print(i)  # 输出:0 1 2 3 4

9.enumerate():同时返回可迭代对象的索引和元素。

lst = ["apple", "banana", "orange"]
for index, value in enumerate(lst):print(index, value)  # 输出:0 apple,1 banana,2 orange

10.zip():将多个可迭代对象的元素打包成一个个元组,然后返回由这些元组组成的列表。

names = ["Tom", "Jerry", "Mike"]
ages = [18, 20, 22]
print(list(zip(names, ages)))  # 输出:[('Tom', 18), ('Jerry', 20), ('Mike', 22)]

over,持续更新中🌹🌹🌹 

 

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

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

相关文章

比较有创意的网站

有创意的网站通常展示了独特的设计、交互或内容。以下是一些备受赞誉的有创意的网站&#xff0c;你可以参考&#xff1a; Awwwards: Awwwards 是一个评选并展示全球最优秀网站的平台。你可以在这里找到很多有创意的网站设计。 Awwwards CSS Design Awards: 类似于Awwwards&…

3d gaussian splatting笔记(paper部分翻译)

本文为3DGS paper的部分翻译。 基于点的&#x1d6fc;混合和 NeRF 风格的体积渲染本质上共享相同的图像形成模型。 具体来说&#xff0c;颜色 &#x1d436; 由沿射线的体积渲染给出&#xff1a; 其中密度 &#x1d70e;、透射率 &#x1d447; 和颜色 c 的样本是沿着射线以…

VSCode插件 —— Cody AI (免费AI助手!)

之前介绍过一款 阿里云免费的AI开发工具——通义灵码 TONGYI Lingma 本文再推荐一个可以极大提高开发前端开发效率的工具 —— Cody AI &#xff08;Sourcegraph&#xff09;&#xff0c;同样是免费的&#xff01; 不过&#xff0c;使用Cody AI需要有github 或 Google 、 git…

vue3相比vue2的效率提升

1、静态提升 2、预字符串化 3、缓存事件处理函数 4、Block Tree 5、PatchFlag 一、静态提升 在vue3中的app.vue文件如下&#xff1a; 在服务器中&#xff0c;template中的内容会变异成render渲染函数。 最终编译后的文件&#xff1a; 1.静态节点优化 那么这里为什么是两部分…

内网安全管理系统(保密管理系统)

在当今信息化的时代&#xff0c;企业的内网已经成为其核心资产的重要组成部分。 随着企业的快速发展和信息化程度的提升&#xff0c;内网安全问题日益凸显&#xff0c;如何保障内网的安全和机密信息的保密性&#xff0c;已经成为企业亟待解决的问题。 内网安全管理系统(保密管…

springboot(ssm计算机学习系统 在线课程学习管理系统Java系统

springboot(ssm计算机学习系统 在线课程学习管理系统Java系统 开发语言&#xff1a;Java 框架&#xff1a;springboot&#xff08;可改ssm&#xff09; vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;mysql 5.7…

C# 实现 摩尔斯电码

摩尔斯电码&#xff08;Morse code&#xff09;是一种用于传输信息的编码系统。它由美国发明家塞缪尔摩尔斯&#xff08;Samuel Morse&#xff09;于1830年代发明并推广。摩尔斯电码是一种通过发送和接收短暂的电信号或光信号来表达字母、数字和标点符号的国际通信方式。 摩尔斯…

现在的小年轻真的卷得过分了,真是完全不把自己当人啊

现在的小年轻真的卷得过分了&#xff0c;真是完全不把自己当人啊 都说00后躺平了&#xff0c;但是有一说一&#xff0c;该卷的还是卷。这不&#xff0c;前段时间我们公司来了个00后&#xff0c;工作都没两年&#xff0c;跳槽到我们公司起薪18K&#xff0c;都快接近我了。后来才…

常用电子器件学习——MOS管

MOS管介绍 MOS&#xff0c;是MOSFET的缩写。MOSFET 金属-氧化物半导体场效应晶体管&#xff0c;简称金氧半场效晶体管&#xff08;Metal-Oxide-Semiconductor Field-Effect Transistor, MOSFET&#xff09;。 一般是金属(metal)—氧化物(oxide)—半导体(semiconductor)场效应晶…

力扣670-最大交换

最大交换 题目链接 class Solution { public:int maximumSwap(int num) {string sto_string(num);//转成字符串for(int i0;i<s.size();i)//选择排序模板{int posi;for(int js.size()-1;j>i;--j)//内层循环从后往前if(s[pos]<s[j])posj;if(pos!i)//如果最大的不是i&a…

unity 相机截图

/// <summary> /// 针对相机的截图 /// </summary> public void CameraScreenShot(){ Rect rect new Rect(0,0,Screen.width,Screen.height); RenderTexture renderTexture RenderTexture.GetTemporary((int)rect.width,(int)rect.height,0, RenderTextureFormat…

RabbitMQ消息应答与发布

消息应答 RabbitMQ一旦向消费者发送了一个消息,便立即将该消息,标记为删除. 消费者完成一个任务可能需要一段时间,如果其中一个消费者处理一个很长的任务并仅仅执行了一半就突然挂掉了,在这种情况下,我们将丢失正在处理的消息,后续给消费者发送的消息也就无法接收到了. 为了…

蓝桥杯官网填空题(骰子迷题)

题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 小明参加了少年宫的一项趣味活动&#xff1a;每个小朋友发给一个空白的骰子&#xff08;它的 6 个面是空白的&#xff0c;没有数字&#xff09;&#xff0c;要小朋…

OpenHarmony驱动消息机制管理

驱动消息机制管理 当用户态应用和内核态驱动需要交互时&#xff0c;可以使用HDF框架的消息机制来实现。 消息机制的功能主要有以下两种&#xff1a; 用户态应用发送消息到驱动。 用户态应用接收驱动主动上报事件。 配置管理 HCS&#xff08;HDF Configuration Source&…

JVM—垃圾回收

什么是垃圾 一个没有被任何引用的对象就是一个垃圾对象, 垃圾对象需要被清理回收,否则一直占用内存空间, 其他新对象无法使用垃圾对象空间, 严重的话会造成内存溢出 早期的垃圾回收&#xff1a; 早期例如c/c是需要程序员手动在程序对不再使用的对象进行删除释放. 给程序…

深入分析 Linux 网络丢包问题

热门IT课程【视频教程】-华为/思科/红帽/oraclehttps://xmws-it.blog.csdn.net/article/details/134398330 所谓丢包&#xff0c;是指在网络数据的收发过程中&#xff0c;由于种种原因&#xff0c;数据包还没传输到应用程序中&#xff0c;就被丢弃了。这些被丢弃包的数量&#…

C语言初学9:数组

一、数组初始化和访问元素 1. 数组声明语句 type arrayName [ arraySize ]; double balance[5]; /* 声明一个长度为5的数组 */ 2. 数组初始化语句 double balance[5] {1000.0, 2.0, 3.4, 7.0, 50.0}; /*或者 double balance[] {1000.0, 2.0, 3.4, 7.0, 50.0};*/ …

C++进阶:多态(下)

1、多态的原理 多态之所以可以实现&#xff0c;主要是因为虚函数表的存在&#xff0c;虚函数表用于记录虚函数的地址&#xff0c;他是一个函数指针数组&#xff0c;在类中用一个函数指针数组指针来指向数组&#xff0c;子类继承了父类的虚函数表&#xff0c;当有重写的情况发生…

基于SAM的视频标注

在本文中&#xff0c;我们将演示基础模型的应用&#xff0c;例如 Meta 的 Segment Anything 和 YOLOv8&#xff0c;以自动检测、分类和绘制视频中感兴趣对象的蒙版。这是之前指南的后续&#xff1a;使用 Meta 的 Segment Anything 和 YOLOv8 自动分类掩码。在本指南中&#xff…

【RabbitMQ】快速入门及基本使用

一、引言 1、、消息队列 Ⅰ、什么是消息队列&#xff1f; 消息队列是一种进程间通信或同一进程的不同线程间的通信方式&#xff0c;软件的贮列用来处理一系列的输入&#xff0c;通常是来自用户。消息队列提供了异步的通信协议&#xff0c;每一个贮列中的纪录包含详细说明的数据…