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

1. Python装饰器

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

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

1.1 闭包 

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

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

def outer_function(x):
    def inner_function(y):
        return x + y
    return inner_function

closure = 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 result
    return 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 time


def demo1(fun):
    def demo2():
        print("demo2中层开始")
        fun()
        time.sleep(2)
        print('睡了两秒,demo2中层结束')

    return demo2


def 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:
            break
    print("内层结束")


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,持续更新中🌹🌹🌹 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【易经】-- 风水基础

目录 一、基础概念 1、五行 2、十天干 3、十二地支 4、八卦 4.1 伏羲八卦次序图 4.2 八卦对应自然界的基本事物 4.3 八卦及所代表的意像 ​编辑 5、生辰八字 5.1 定义 5.2 换算方法 5.3 举例 5.4 八字排盘示例 5.5 算法实现 二、举例 1、计算某年的生肖和年的属…

【nginx实战】nginx正向代理、反向代理、由反向代理实现的负载均衡、故障转移详解

文章目录 一. 正向代理与反向代理的概念二. Nginx服务器的正向代理服务1. Nginx服务器正向代理服务的配置的3个指令1.1. resolver指令1.2. resolver_timeout指令1.3. proxy_pass指令 2. Nginx服务器正向代理服务的使用 三. Nginx服务器的反向代理服务1. 反向代理的基本指令1.1.…

高数总结(1

目录 1.总结&#xff1a;小结&#xff1a; 1.总结&#xff1a; 小结&#xff1a; 关注我给大家分享更多有趣的知识&#xff0c;以下是个人公众号&#xff0c;提供 ||代码兼职|| ||代码问题求解|| 由于本号流量还不足以发表推广&#xff0c;搜我的公众号即可&#xff1a;

基于51单片机的超声波物位测量系统[proteus仿真]

基于51单片机的超声波物位测量系统[proteus仿真] 超声波检测系统这个题目算是课程设计和毕业设计中常见的题目了&#xff0c;本期是一个103基于51单片机的超声波物位测量系统 需要的源文件和程序的小伙伴可以关注公众号【阿目分享嵌入式】&#xff0c;赞赏任意文章 2&#xf…

Redis 笔记二

概览 1.高并发秒杀问题及可能出现的bug 2.秒杀场景JVM级别锁和分布式锁 3.大厂分布式锁Redisson框架 4.从Redisson源码剖析lua解决锁原子性问题 5.从Redisson源码剖析经典锁续命问题 6.Redis主从架构锁失效如何解决 7.Redlock分布式锁高并发下可能存在的问题 8.双十一大促如何将…

【学习】FPN特征金字塔

论文&#xff1a;Feature Pyramid Networks for Object Detection &#xff08;CVPR 2016) 参考blog&#xff1a;https://blog.csdn.net/weixin_55073640/article/details/122627966 参考视频讲解&#xff1a;添加链接描述 卷积网络中&#xff0c;深层网络容易响应语义特征&am…

【C++】list容器功能模拟实现

介绍 上一次介绍了list队容器的迭代器模拟&#xff0c;这次模拟实现list的简单功能&#xff0c;尤其要注意构造函数、析构函数、以及赋值运算符重载的实现。 list容器需要接纳所有类型的数据&#xff0c;因此&#xff0c;结构设置与迭代器设置同理&#xff0c;需要引入结点&…

Dirichlet Process 3

本节来介绍如何构造G&#xff0c;这里使用Stick-breaking construction算法 如下图H是关于的分布 对于G&#xff0c;这里面有2个变量&#xff0c;一个是&#xff0c;即采样的位置&#xff0c;一个是&#xff0c;即的权重 每次采样一次称为一个item 第一次采样 ,, 第二次采样…

c++的命名空间

命名空间 一.c的关键字二.命名空间2.1 命名空间定义2.1 命名空间的使用2.1.1加命名空间名称及作用域限定符2.1.2使用using将命名空间中某个成员引入 三.标准命名空间std 一.c的关键字 c中一共有63个关键字 关键字11111asmdoifreturntrycontinueautodoubleinlineshorttypedeff…

vue echarts地图

下载地图文件&#xff1a; DataV.GeoAtlas地理小工具系列 范围选择器右侧行政区划范围中输入需要选择的省份或地市&#xff0c;选择自己想要的数据格式&#xff0c;这里选择了geojson格式&#xff0c;点右侧的蓝色按钮复制到浏览器地址栏中&#xff0c;打开的geojson文件内容…

LeetCode 670 最大交换数

周一&#xff0c;非常冷&#xff0c;大风呼呼的&#xff0c;上班路都走不动。 好消息&#xff0c;马上要过年了。大风吹&#xff0c;天气好。 过年过年&#xff0c;回家过年~ 学生时代的迷茫是不应该存在的&#xff0c;最好的时光应该尽情享受&#xff0c;而不应该自己给加层…

三年的功能测试,让我女朋友跑了,太难受了...

简单概括一下 先说一下自己的情况&#xff0c;普通本科&#xff0c;18年通过校招进入深圳某软件公司&#xff0c;干了3年多的功能测试&#xff0c;21年的那会&#xff0c;因为大环境不好&#xff0c;我整个人心惊胆战的&#xff0c;怕自己卷铺盖走人了&#xff0c;我感觉自己不…

测试数据: 在线MP4和图片url地址

收集整理一些开发中用到的测试数据 目录 MP4图片ICON MP4 https://media.w3.org/2010/05/sintel/trailer.mp4 图片 https://img-blog.csdnimg.cn/fcc22710385e4edabccf2451d5f64a99.jpeg ICON https://img-blog.csdnimg.cn/direct/fb1e1f109889467a85eec6af0984611c.png 以…

协同过滤源代码在真实数据集上运行及优化

最近在做推荐算法相关研究&#xff0c; 先拿一个协同过滤代码练手。 网上找代码很容易&#xff0c;但是大多是讲原理的示例代码&#xff0c;在真实数据集上运行问题特别多。 以一个2w节点的开源数据集为例&#xff08;baby.inter&#xff09; https://github.com/enoche/MM…

PSIM仿真DSP28335ADC功能并使用SCI串口模块输出曲线

在使用PSIM 2022 软件仿真DSP28335单片机时&#xff0c;发现里面还有SCI串口打印模块&#xff0c;在仿真软件里面可以看到串口数据&#xff0c;但是将代码下载到单片机上之后&#xff0c;使用串口助手却看不到任何数据&#xff0c;经过一番探索终于发现&#xff0c;串口不是这样…

【linux】串口工具

1. PuTTY - 尽管PuTTY更为人所知作为SSH和Telnet客户端&#xff0c;但它也有串口连接能力。 - 在Debian上可以通过命令 sudo apt-get install putty 来安装PuTTY。 2. Minicom - Minicom是一个字符界面的串行通信程序&#xff0c;经常用于调试串口和模拟器。 - 可以通过…

webserver 之 线程同步 线程池(半同步半反应堆)

目录 &#x1f402;前言 &#x1f351;B / S 模型 &#x1f418;线程同步机制 &#x1f33c;概念 &#xff08;1&#xff09;RAII &#xff08;2&#xff09;信号量 &#xff08;3&#xff09;互斥量 &#xff08;4&#xff09;条件变量 &#x1f33c;功能 &#xf…

python丰富的任务进度显示

pip install txdpy 安装 txdpy from txdpy import progbar 导入 progbar progbar()函数传入一个可遍历对象&#xff0c;返可迭代对象 from txdpy import progbar from random import uniform from time import sleepfor i in progbar(range(4651)):print(f第{i}条任务)…

Ubuntu Desktop 隐藏 / 显示文件和文件夹

Ubuntu Desktop 隐藏 / 显示文件和文件夹 1. GUI hot key2. Show hidden and backup filesReferences 1. GUI hot key Ctrl H: 隐藏 / 显示文件和文件夹 2. Show hidden and backup files Edit -> Preferences -> Views References [1] Yongqiang Cheng, https://yo…

Linux:vim的相关知识

目录 vim 是一个较为常见的编译文件的命令操作。 三种模式的区分的作用如下&#xff1a; 命令模式&#xff1a; 插入模式&#xff1a; 进入插入模式的标志&#xff1a;左下角有INSERT 底行模式&#xff1a; 命令模式的常见命令&#xff1a; 底行模式常见命令&#xff1…