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

这篇具有很好参考价值的文章主要介绍了惬意上手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装饰器

 文章来源地址https://www.toymoban.com/news/detail-819568.html

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

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

惬意上手Python —— 装饰器和内置函数,python,开发语言

 

到了这里,关于惬意上手Python —— 装饰器和内置函数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 如何使用Python内置缓存装饰器: @lru_cache,@cache 与 @cached_property

    使用缓存是优化Python程序速度的重要方法之一 。如果使用得当,可以大幅减少计算资源的负载,有效加快代码运行速度 Python 的内置库 functools 模块附带了 @lru_cache,@cache, @cached_property 装饰器,使用非常简便,不需要安装第3方库,不需要 redis 等数据库保存对象等,通常只需要

    2024年02月11日
    浏览(40)
  • python 单例模式,装饰类,装饰函数

    知乎 python 实现单例模式的两种方式 stack overflow 装饰函数 vs 装饰类 medium Do we even need a class to realize singleton? 单例模式大家肯定不陌生了,在读reference的两篇blog时突然发现用python实现单例模式的很多好玩之处。 用类实现单例模式是各种语言比较通用的方式。在python中的实现就

    2024年02月16日
    浏览(38)
  • 【Python】Python函数的黑魔法:递归,嵌套函数与装饰器

    欢迎来到CILMY23的博客 本篇主题为: Python函数的黑魔法:递归,嵌套函数与装饰器 个人主页:CILMY23-CSDN博客 系列专栏:Python | C++ | C语言 | 数据结构与算法 感谢观看,支持的可以给个一键三连,点赞关注+收藏。 写在前头: 本期主要补充上篇未完成的内容,(点击链接

    2024年04月25日
    浏览(34)
  • 系统学习Python——装饰器:函数装饰器-[添加装饰器参数:基础知识]

    分类目录:《系统学习Python》总目录 前面文章介绍的计时器装饰器有效运行,但是如果它可配置性更强的话,就会更好一一一例如提供一个输出标签并且可以打开或关闭跟踪消息,这些在一个多用途工具中可能很有用。装饰器参数在这里派上了用场:对它们适当编写后,我们

    2024年02月22日
    浏览(38)
  • 【python基础语法七】python内置函数和内置模块

    eval 和 exec 在和第三方用户交互时候,谨慎使用; 应用不一样: json主要用于传输 转换关系 localtime = mktime = ctime

    2024年02月01日
    浏览(47)
  • Python 函数(lambda 匿名函数、自定义函数、装饰器)基本使用指南

    函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段 对于单行函数,使用 lambda 表达式可以省去定义函数的过程,让代码更加简洁; 对于不需要多次复用的函数,使用 lambda 表达式可以在用完之后立即释放,提高程序执行的性能。 格式: 一般形式 含 if

    2024年02月08日
    浏览(53)
  • python中函数,装饰器,迭代器,生成器

    1.函数可以作为参数进行传递 2.函数可以作为返回值进行返回 3.函数名称可以当成变量一样进行赋值操作 作用:在不改变原有函数调用的情况下,给函数增加新的功能          即可以在函数前面增加新的功能,但不改变原来的代码 可迭代的数据类型都会提供迭代器,即可以

    2024年02月07日
    浏览(45)
  • python函数装饰器参数统计调用时间和次数

    python在函数装饰器外层定义一个函数生成封闭作用域来保存装饰器入参,供装饰器使用。 描述 通过类的可调用实例装饰器来统计函数每次调用时间和总调用时间,以及调用次数。 (1) time.perf_counter()获取当前时间,单位秒; (2) 调用函数func前和后的时间差,为func的执行

    2024年02月01日
    浏览(85)
  • 【Python】内置函数

    数据类型 4 bool([x]) 定义: 将给定参数转换为布尔类型,如果没有参数,返回 False。 int((x, base=10) 定义: 将一个字符串或数字转换为整型。 参数说明: x – 字符串或数字。 base – 进制数,默认十进制。 float([x]) 定义: 将整数和字符串转换成浮点数。 complex([real[, imag]]) 定义

    2024年02月06日
    浏览(39)
  • python-常用的内置函数

    从实现函数的角度来看,其至少需要想清楚以下 3 点: 1.函数需要几个关键的需要动态变化的数据,这些数据应该被定义成函数的 参数 。 2.函数需要传出几个重要的数据(就是调用该函数的人希望得到的数据),这些数据应该被定义成 返回值 。 3. 函数的内部实现过程 。

    2024年02月08日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包