【Python】闭包 | 装饰器

这篇具有很好参考价值的文章主要介绍了【Python】闭包 | 装饰器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

闭包

在函数嵌套的前提下,内部函数使用到了外部函数的变量,并且外部函数返回了内部函数,我们把这个使用外部函数变量的内部函数称为闭包。

# 闭包
def account_init(init_amount=0):
    def atm(num, flag=True):
        nonlocal init_amount
        if flag:
            init_amount += num
            print(f"存款:+{num},账户余额:{init_amount}")
        else:
            init_amount -= num
            print(f"取款:-{num},账户余额:{init_amount}")

    return atm


fn = account_init()
fn(300)                 # 存款:+300,账户余额:300
fn(200)                 # 存款:+200,账户余额:500
fn(100, False)            # 取款:-100,账户余额:400

需要使用nonlocal关键字修饰外部函数的变量才可在内部函数中修改它。

闭包注意事项

优点

  • 无需定义全局变量即可实现通过函数,持续的访问、修改某个值
  • 闭包使用的变量所用于在函数内,难以被错误的调用修改

缺点:

  • 由于内部函数持续引用外部函数的值,所以会导致一部分内存空间不被释放,一直占用内存

装饰器

装饰器其实也是一种闭包,其功能就是在不破坏目标函数原有的代码和功能的前提下,为目标函数增加新功能。

装饰器的一般写法(闭包写法)

定义一个闭包函数,在闭包函数内部:

  • 执行目标函数
  • 并完成功能的添加
# 装饰器的一般写法(闭包写法)
def outer(func):
    def inner():
        print('开始睡觉')
        func()
        print('开始起床')

    return inner


def sleep():
    import random
    import time
    print('睡眠中。。。')
    time.sleep(random.randint(1, 5))


fn = outer(sleep)
fn()

# -----------执行结果-----------
# 开始睡觉
# 睡眠中。。。
# 开始起床

装饰器的快捷写法(语法糖)

使用@outer定义在目标函数之上。文章来源地址https://www.toymoban.com/news/detail-703310.html

# 装饰器的快捷写法(语法糖)
def outer(func):
    def inner():
        print('开始睡觉')
        func()
        print('开始起床')

    return inner


@outer
def sleep():
    import random
    import time
    print('睡眠中。。。')
    time.sleep(random.randint(1, 5))


sleep()

# -----------执行结果-----------
# 开始睡觉
# 睡眠中。。。
# 开始起床

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

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

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

相关文章

  • Python 知识体系补全(闭包、装饰器、关键字参数**kwargs,位置参数*args)

    闭包:     什么是闭包,一句话,在函数中再嵌套一个函数,并且引用外部函数的变量,这就是一个闭包了     一般外部函数的返回值为内部函数      def outer(x):          def inner(y):              return x + y         return outer     # 外部函数的返回值,是内部函数     

    2024年02月06日
    浏览(39)
  • python测试开发面试常考题:装饰器

    Python 装饰器是一个可调用的(函数、方法或类),它获得一个函数对象 func_in 作为输入,并返回另一函数对象 func_out。它用于扩展函数、方法或类的行为。 装饰器模式通常用于扩展对象的功能。在日常生活中,这种扩展的例子有:在枪上加一个消音器,使用不同的相机镜头等等

    2024年02月10日
    浏览(82)
  • 闭包和装饰器

    在函数内部再定义⼀个函数,并且这个内部函数⽤到了外部的变量,这个函数以及⽤到外部函数的变量及参数叫闭包 再比如二次函数: 从这段代码中,函数line与变量a,b构成闭包。在创建闭包的时候,我们通过line_conf的参数a,b说明了这两个变量的取值,这样,我们就确定了函数

    2024年02月12日
    浏览(31)
  • LLM大语言模型(三):使用ChatGLM3-6B的函数调用功能前先学会Python的装饰器

    目录 ChatGLM3-6B的函数调用模式示例 本地启动ChatGLM3-6B工具模式 如何在ChatGLM3-6B里新增一个自定义函数呢? get_weather基于Python的装饰器实现 函数注解@register_tool 现在我们来自定义一个kuakuawo()函数 ChatGLM3-6B目前有三种使用模式: 对话模式 工具模式(也就是本文要介绍的函数调用

    2024年01月25日
    浏览(72)
  • python---闭包

    闭包定义:在函数嵌套的前提下,内部函数使用了外部函数的变量,并且外部函数返回了内部函数,我们把这个使用外部函数变量的内部函数称为闭包 2.必报的构成条件: 在函数嵌套(函数里面在定义函数)的前提下 内部函数使用了外部函数的变量(还包括外部函数的参数

    2024年02月05日
    浏览(29)
  • Python名称空间和作用域,闭包函数

    名称的查询顺序 名称空间的作用域 global和nonlocal的使用 函数对象(函数名) 函数的嵌套调用 函数的嵌套定义 闭包函数

    2024年02月09日
    浏览(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中的装饰器(基础装饰器)

    1. 高阶函数 在python中, 如果一个函数的参数是另外一个或几个函数,那么这个函数就是高阶函数 ,如下 上面的函数fun2就是一个高阶函数,因为它的参数是一个函数fun1。 2. 闭包 在python中, 闭包是一个函数,它延伸了变量的作用域,使得在定义变量的作用域失效后,该变量

    2023年04月24日
    浏览(34)
  • Python小知识 - Python装饰器

    Python装饰器 在Python中,装饰器是一个特殊的函数,可以将其他函数包装在装饰器函数中,并且将被包装的函数作为参数传递给装饰器函数。 使用装饰器的好处是可以自动在被包装的函数前后执行一些额外的代码,比如在函数执行前后打印日志,或者在函数执行前后计算函数

    2024年02月09日
    浏览(39)
  • 系统学习Python——装饰器:类装饰器-[初探类装饰器和元类]

    分类目录:《系统学习Python》总目录 函数装饰器是如此有用,以至于Python2.X和Python3.X都扩展了这一模式,允许装饰器应用于类和函数。简而言之,类装饰器类似于函数装饰器,但它们是在一条 class 语句的末尾运行,并把一个类名重新绑定到一个可调用对象。同样,它们可以

    2024年02月19日
    浏览(36)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包