• python装饰器@,内嵌函数,闭包


    装饰器(Decorators)是 Python 的一个重要部分。简单地说:他们是修改其他函数的功能的函数。他们有助于让我们的代码更简短,也更Pythonic(Python范儿)。

    大多数初学者不知道在哪儿使用它们,所以我将要分享下,哪些区域里装饰器可以让你的代码更简洁。 首先,让我们讨论下如何写你自己的装饰器。

    这可能是最难掌握的概念之一。我们会每次只讨论一个步骤,这样你能完全理解它。

    此外装饰器视频可以参考:https://www.bilibili.com/video/BV11s411V7Dt/?spm_id_from=333.788.recommend_more_video.1,这个讲的很清晰。

     

     

     

     以上参考:https://www.runoob.com/w3cnote/python-func-decorators.html,这个网址的后部分讲解的不太好,故没引用。

    以下摘自:https://blog.csdn.net/weixin_42205776/article/details/89333359

    一、函数修饰符

      '@' 用做函数的修饰符,可以在模块或者类的定义层内对函数进行修饰,

      出现在函数定义的前一行,不允许和函数定义在同一行

      一个修饰符就是一个函数,它将被修饰的函数作为参数,并返回修饰后的同名函数或其他可调用的东西?

      

    要了解python中@装饰器的作用,首先要记住这么几点:

    1. 装饰器符号“@”属于语法糖,什么意思呢?就是说,我不按照@装饰器的语法要求来写,而是按照一般python的语法要求来写完全可以。那么用@装饰器的格式来写的目的就是为了书写简单方便

    2. 装饰器的作用是什么呢? 简单的理解就是:装饰原有的函数。什么意思呢?比如有一个函数func(a, b),它的功能是求a,b的差值,我现在有一个需求,就是想对函数功能再装饰下,求完差值后再取绝对值,但是不能在func函数内部实现,这时候就需要装饰器函数了,比如func = decorate(func)函数,将func函数作为参数传递给decorate函数,由decorate来丰富func函数,丰富完成后再返回给func,此时func的功能就丰富了。

    3.python的常识,函数和其他任何东西一样,都是对象。这意味着可以将函数当做实参传递给函数,或者在函数中将函数作为返回值返回。例码验证:

    >>> def add(x, y):
    ...     return x + y
    >>> def sub(x, y):
    ...     return x - y
    >>> def apply(func, x, y): # 1
    ...     return func(x, y) # 2
    >>> apply(add, 2, 1) # 3
    3
    >>> apply(sub, 2, 1)
    1
    了解上述观点后,可以先不用@符号来写一个简单的装饰器

    对于sub = decorate(sub)的理解。  最终会将inner的值传给sub ,此时执行sub(3, 4),其实是执行decorate中的inner,所以为1.

    那么为了书写方便,将sub=decorate(sub)换为@decorate,并放在sub的定义面前,即:

    @decorate

    def sub(a, b):

        return a-b

    只是书写不同,结果相同。

    内嵌函数和闭包

    def aa():
        print('hello aa !')
    b=aa
    print(b)
    print(aa)
    print(b())
    
    输出为:
    <function aa at 0x0000015B5613B0D0>
    <function aa at 0x0000015B5613B0D0>
    hello aa !
    None
    

    原因为:当b=aa时,只是把aa函数的地址赋值给b,所以print(b)和print(aa)打印的都是地址而已。

    想要打印函数本应输出的内容只有后面加括号,才能表达。print(b()),print(aa);至于最后为何打印出一个None,不知道怎么解释。

     

     可把var=3移到print(var)前面就行了。

    也可以做如下修改:

     

     

     

     

     

     上述参考:https://www.runoob.com/python/att-string-count.html

     

      

    def aa():
        print('hello aa !')
    # b=aa
    # print(b)
    # print(aa)
    # print(b())
    def g(f):
        aa()
    g(aa)
    
    输出:
    hello aa!
    

      

     

     但是会更方便程序员的使用。

    覆盖了原函数的定义,这里的装饰器显然也是高阶函数。

    注意上图中第一个装饰函数@dec后面时没有括号的,其等价于f=dec(f)。如果带了括号(第二个),就等价于f=dec(x)(f)。

    第一个函数@dec,其意思为:把其下的f函数作为其一个参数,并且把返回的值再次绑定到原函数f上去。覆盖了原函数的定义。

    如果加括号了,比如第二个@dec(x),则意思就是线调用dec(x),再把整个dec(x)的结果(或这个说x代表的表达式或x代表的单个变量)的结果作为一个装饰器来处理其(dec(x))下面的函数。

      

      

  • 相关阅读:
    SoundTouch
    80211
    netsh wlan
    jest--cmd
    必须精通nuxt了,不可变,to thi
    bili实际的ssr
    vscode 调试vuetify
    【Java】 第四章 异常处理 Notes learn Ma
    Windows 下的符号链接 小示例
    Java 第一二章 配置基础 与 java 数据类型
  • 原文地址:https://www.cnblogs.com/Li-JT/p/15063259.html
Copyright © 2020-2023  润新知