Python的闭包和装饰器你真的了解吗

 更新时间:2022年02月14日 08:58:09   作者:尤诺.  
这篇文章主要为大家详细介绍了Python的闭包和装饰器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助

闭包

闭包就是能够读取其他函数内部变量的函数。

def test1(k, b):
    def test1_1(x):
        print(k*x+b)
    return test1_1
t1 = test1(1, 2)
t1(0)
t1(1)
t1(2)

闭包中修改数据

x = 300
def test1():
    x = 200
    def test2():
        nonlocal x
        print("----1----x = {}".format(x))
        x = 100
        print("----2----x = {}".format(x))
    return test2
t1 = test1()
t1()

装饰器

实现对无参数函数的装饰器

def set_func(func):
    def call_func():
        print("装饰器执行")
        func()
    return call_func
@set_func   # 等价于sumNum = set_func(sumNum)
def sumNum():
    print("sumNum")
sumNum()

实现对有参数函数的装饰器

# 对有参数、无返回值的函数进行装饰
def set_func(func):
    def call_func(num):
        print("装饰器")
        func(num)
    return call_func
@set_func
def sumNum(num):
    print("sumNum = {}".format(num))
sumNum(100)

对不定长参数的函数进行装饰

def set_func(func):
    def call_func(*args, **kwargs):
        print("装饰器")
        func(*args, **kwargs)  # 拆包
    return call_func
@set_func
def sumNum(num, *args, **kwargs):
    print("sumNum = {}".format(num))
    print("args = {}".format(args))
    print("kwargs = {}".format(kwargs))
sumNum(100, 200, c=100)

对有返回值的函数进行装饰

def set_func(func):
    def call_func(*args, **kwargs):
        print("装饰器")
        return func(*args, **kwargs)  # 拆包
    return call_func
@set_func
def sumNum(num, *args, **kwargs):
    print("sumNum = {}".format(num))
    print("args = {}".format(args))
    print("kwargs = {}".format(kwargs))
    return "200 ok"
sumNum(100, 200, c=100)

多个装饰器对同一个函数装饰

def add_h1(func):
    def h1():
        h1_str = "<h1>" + func() + "</h1>"
        return h1_str
    return h1

def add_a(func):
    def call_func():
    	a_str = "<a>" + func() + "</a>"
        return a_str
    return call_func

@add_h1
@add_a
def get_str():
    return "haha"
get_str()

输出为:<h1><a>haha</a></h1>

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!   

相关文章

  • 详解如何创建Python元类

    详解如何创建Python元类

    通过本文,将深入讨论Python元类,其属性,如何以及何时在Python中使用元类。
    2021-05-05
  • Python中用startswith()函数判断字符串开头的教程

    Python中用startswith()函数判断字符串开头的教程

    这篇文章主要介绍了Python中用startswith()函数判断字符串开头的教程,startswith()函数的使用是Python学习中的基础知识,本文列举了一些不同情况下的使用结果,需要的朋友可以参考下
    2015-04-04
  • 跟老齐学Python之网站的结构

    跟老齐学Python之网站的结构

    本教程的最终目的就是教会大家如何使用Python制作网站,非常的详尽,需要的朋友可以参考下
    2014-10-10
  • python实现网上购物系统

    python实现网上购物系统

    这篇文章主要为大家详细介绍了python实现网上购物系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • PyCharm搭建Spark开发环境的实现步骤

    PyCharm搭建Spark开发环境的实现步骤

    这篇文章主要介绍了PyCharm搭建Spark开发环境的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • 分析语音数据增强及python实现

    分析语音数据增强及python实现

    数据增强是一种生成合成数据的方法,即通过调整原始样本来创建新样本。这样我们就可获得大量的数据。这不仅增加了数据集的大小,还提供了单个样本的多个变体,这有助于我们的机器学习模型避免过度拟合
    2021-06-06
  • pandas.str.replace 不起作用的解决方法

    pandas.str.replace 不起作用的解决方法

    最近做项目,涉及到字符串替换,所以直接想到的方法是用 pandas.Series.str.replace 来进行替换,本文主要介绍了pandas.str.replace 不起作用的解决方法,感兴趣的可以了解一下
    2024-03-03
  • Python操作Excel数据的封装函数分享

    Python操作Excel数据的封装函数分享

    对比其它编程语言,我们都知道Python最大的优势是代码简单,有丰富的第三方开源库供开发者使用。而对于数据的读取和存储,对于普通人来讲,除了数据库之外,最常见的就是微软的Excel。本文为大家准备了Python操作Excel数据的封装函数,希望对大家有所帮助
    2022-11-11
  • python调用有道智云API实现文件批量翻译

    python调用有道智云API实现文件批量翻译

    这篇文章主要介绍了python如何调用有道智云API实现文件批量翻译,帮助大家更好得理解和使用python,感兴趣的朋友可以了解下
    2020-10-10
  • Python urllib3软件包的使用说明

    Python urllib3软件包的使用说明

    这篇文章主要介绍了Python urllib3软件包的使用说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11

最新评论