惬意上手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.rhkb.cn/news/243999.html

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

相关文章

Spring Cloud可视化智慧工地大数据云平台源码(人、机、料、法、环五大维度)

智慧工地平台是依托物联网、互联网、AI、可视化建立的大数据管理平台&#xff0c;是一种全新的管理模式&#xff0c;能够实现劳务管理、安全施工、绿色施工的智能化和互联网化。围绕施工现场管理的人、机、料、法、环五大维度&#xff0c;以及施工过程管理的进度、质量、安全三…

JUC并发编程-集合不安全情况以及Callable线程创建方式

6. 集合不安全 1&#xff09;List 不安全 //java.util.ConcurrentModificationException 并发修改异常&#xff01; public class ListTest {public static void main(String[] args) {List<Object> arrayList new ArrayList<>();for(int i1;i<30;i){new Thr…

“疫”后不emo,直播电商点亮鞋服赛道新生机

“ 走出阴霾&#xff0c;把握机遇 ” 文&#xff5c;王娴 编辑 | 靳淇 出品&#xff5c;极新 2023年&#xff0c;零售消费呈现缓慢复苏趋势&#xff0c;而直播电商也越发成为消费行业的重要增长引擎。对鞋服行业而言&#xff0c;直播电商独特的内容生态在传递时尚理念、激…

【GitHub项目推荐--微软开源的可视化工具】【转载】

说到数据可视化&#xff0c;大家都很熟悉了&#xff0c;设计师、数据分析师、数据科学家等&#xff0c;都需要用各种方式各种途径做着数据可视化的工作.....当然许多程序员在工作中有时也需要用到一些数据可视化工具&#xff0c;如果工具用得好&#xff0c;就可以把原本枯燥凌乱…

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

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

【数据结构】二叉树算法讲解(定义+算法原理+源码)

博主介绍&#xff1a;✌全网粉丝喜爱、前后端领域优质创作者、本质互联网精神、坚持优质作品共享、掘金/腾讯云/阿里云等平台优质作者、擅长前后端项目开发和毕业项目实战✌有需要可以联系作者我哦&#xff01; &#x1f345;附上相关C语言版源码讲解&#x1f345; &#x1f44…

暴力破解常见的服务器

目录 使用 pydictor 生成自己的字典工具liunx下载使用常用的参数说明插件型字典 (可自己根据 API 文档开发) 使用 hydra 工具在线破解系统用户密码使用 hydra 破解 windows 7 远程桌面密码使用 hydra 工具破解 ssh 服务 root 用户密码 使用 Medusa 工具在线破解medusa参数说明M…

NetSuite 文心一言(Ernie)的AI应用

有个故事&#xff0c;松下幸之助小时候所处的年代是明治维新之后&#xff0c;大量引用西洋技术的时期。当时大家对“电”能干什么事&#xff0c;充满好奇。“电能干什么&#xff1f;它能帮我们开门么&#xff1f;” 松下幸之助的爷爷对电不屑&#xff0c;于是就问他。松下幸之助…

设计模式—行为型模式之观察者模式

设计模式—行为型模式之观察者模式 观察者模式(Observer Pattern)&#xff1a;定义对象间的一种一对多依赖关系&#xff0c;使得每当一个对象状态发生改变时&#xff0c;其相关依赖对象皆得到通知并被自动更新。观察者模式又叫做发布-订阅&#xff08;Publish/Subscribe&#…

Vue-33、Vue中为什么使用render函数

1、main.js //该文件是整个项目的入口文件 //引入Vue import Vue from vue //引入APP组件&#xff0c;他是所有组件的父组件 import App from ./App.vue //关闭Vue是生产提示 Vue.config.productionTip false; //创建Vue实例对象---vm new Vue({render: h > h(App), }).$m…

C#winform上位机开发学习笔记7-串口助手的波特率参数设置功能添加

1.功能描述 上位机与下位机进行通讯时需要用到波特率设置功能&#xff0c;以及尝试与下位机实体进行通讯。 2.代码部分 步骤1&#xff1a;串口开启按钮事件中添加代码 serialPort1.BaudRate Convert.ToInt32(comboBox14.Text, 10);//将十进制的文本转换为32位整型赋值给串…

RK3568 android11 移植 v4l2loopback 虚拟摄像头

一&#xff0c;v4l2loopback 简介 v4l2loopback是一个Linux内核模块&#xff0c;它允许用户创建虚拟视频设备。这种虚拟视频设备可以用于各种用途&#xff0c;例如将实际摄像头的视频流复制到虚拟设备上&#xff0c;或者用于视频流的处理和分析等。v4l2loopback的主要作用是创…

WordPress后台底部版权信息“感谢使用 WordPress 进行创作”和版本号怎么修改或删除?

不知道各位WordPress站长在后台操作时&#xff0c;是否有注意到每一个页面底部左侧都有一个“感谢使用 WordPress 进行创作。”&#xff0c;其中WordPress还是带有nofollow标签的链接&#xff1b;而页面底部右侧都有一个WordPress版本号&#xff0c;如下图中的“6.4.2 版本”。…

[设计模式Java实现附plantuml源码~创建型] 对象的克隆~原型模式

前言&#xff1a; 为什么之前写过Golang 版的设计模式&#xff0c;还在重新写Java 版&#xff1f; 答&#xff1a;因为对于我而言&#xff0c;当然也希望对正在学习的大伙有帮助。Java作为一门纯面向对象的语言&#xff0c;更适合用于学习设计模式。 为什么类图要附上uml 因为很…

【GitHub项目推荐--Git 教程】【转载】

本开源项目是 Will 保哥在 2013 第 6 界 IT 邦帮忙铁人赛年度大奖的得奖著作。这是一个 Git 教程&#xff0c;这个开源教程用 30 天的时间&#xff0c;带领大家详细了解使用 Git 。 重点介绍了 Git 的一些常用操作&#xff0c;以及日常工作中实际应用场景讲解&#xff0c;下图…

docker里Java服务执行ping命令模拟流式输出

文章目录 业务场景处理解决实现ping功能并实时返回输出实现长ping和中断请求docker容器找不到ping命令处理 业务场景 我们某市的客户&#xff0c;一直使用CS版本的信控平台&#xff0c;直接安装客户Windows server服务器上&#xff0c;主要对信号机设备进行在线管理、方案配时…

5118优惠码vip、svip、专业版和旗舰版使用yhm666

5118大数据平台会员优惠码【yhm666】&#xff0c;结算时勾选“使用优惠码”&#xff0c;然后在优惠码窗口中输入yhm666&#xff0c;然后点确定即可享受特价会员价格。阿腾云atengyun.com分享如下图&#xff1a; 5118会员优惠码【yhm666】 5118会员价格和使用优惠码之后的价格对…

【UE5】第一次尝试项目转插件(Plugin)的时候,无法编译

VS显示100条左右的错误&#xff0c;UE热编译也不能通过。原因可能是[名字.Build.cs]文件的错误&#xff0c;缺少一些内容&#xff0c;比如说如果要写UserWidget类&#xff0c;那么就要在 ]名字.Build.cs] 中加入如下内容&#xff1a; public class beibaoxitong : ModuleRules …

Minio 判断对象是否存在

引 Minio数据模型 中描述了 MinIO 中什么是桶&#xff0c;什么是对象&#xff0c;也给出了操作桶和操作对象的API。 在 MinIO 中&#xff0c; 对象 中间前缀 对象名称 。如何判定对象是否存在呢&#xff1f; 分析 在 MinIO 中并没有提供判断对象是否存在的操作&#xff…

2024年上海高考数学最后四个多月的备考攻略,目标140+

亲爱的同学们&#xff0c;寒假已经来临&#xff0c;春节即将到来&#xff0c;距离2024年上海高考已经余额不足5个月了。作为让许多学子头疼&#xff0c;也是拉分大户的数学科目&#xff0c;你准备好了吗&#xff1f;今天&#xff0c;六分成长为您分享上海高考数学最后四个多月的…