• Python 基础第十一天(闭包和装饰器初识)


    今日内容:

    函数名的应用

    闭包

    装饰器的初识

    装饰器的传参

    1.函数名的应用

    函数名是函数的名字.

    本质:变量,特殊的变量。是函数的内存地址

    函数名() 可以执行此函数

    (1)单独打印函数名,可以得到函数的内存地址:

    print(func1)  # <function func1 at 0x0000000000872378>

    (2)函数名可以赋值

    例:

    def func2():
    print(666)
    #
    f = func2
    print(f())

    (3)函数名可以作为容器类数据的元素。

    例:

    def f1():
    print('f1')


    def f2():
    print('f2')


    def f3():
    print('f3')

    l = [f1,f2,f3]
    d = {'f1':f1,'f2':f2,'f3':f3}
    #调用
    l[0]()
    d['f2']()

    (4)函数可以作为参数

    def f1():
    print(666)
    def f2(x): # x = f1
    x() # f1()
    f2(f1)


    (5)函数名可以作为函数的返回值

    def wraaper():
      def inner():
        print(666)
      return inner

    ret = wraaper() # inner
    ret() # inner()

    #此代码的流程分析

    代码由 上而下,def 设置了一个wraaper的变量名,由于没有引用变量,一直向下,到达,ret = wraaper(),看到变量赋值,优先计算等号右边的,即wraaper(),引用wraaper()函数,然后进入下一层, def inner(),记录变量名称,不走变量体,return返回inner,函数结束.return将inner返回给函数调用者,wraaper(),即ret = inner

    然后运行代码inner(),然后找到局部空间内的inner函数,继续执行inner下面的内容.直到代码结束.

    2.闭包

    就是内层函数对外层函数(非全局)变量的引用。

    python遇到闭包,有一个机制,会开辟一个空间,将闭包中的所有的变量等存储起来,不随着函数的结束而关闭。
    闭包的完美体现:装饰器。

    如何判断:内层函数名.__closure__  cell 就是=闭包

     例题

    def wraaper1():
      name = '老男孩'
      def inner():
        print(name)
      inner()
      print(inner.__closure__) 

    wraaper1()

    # cell返回,则是闭包

    name = '老男孩'
    def wraaper2():
      name1 = 'alex'
      inner()

       print(name)

       print(name1)
    print(inner.__closure__) # None
    wraaper2()
    变量name为全局变量,不属于外层函数的,所以不是闭包

    装饰器初识:

    什么是装饰器:

    装饰器是在不改变现有函数的调用方式的情况下,对函数功能改变或者添加新的功能的新函数叫做装饰器.

    也可以描述为在不改变原函数的执行的情况下,为原函数增加额外的功能

    装饰器的固定格式:(被装饰函数带参数的装饰器)

    def wrapper(funcl):

      def inner(*args,**kwargs):

        '''被装饰函数运行之前''

        retsalt = funcl(*args,**kwargs)

        '''被装饰函数运行之后'''

        return retsalt

      return inner

    @wrapper   #funcl = wrapper(funcl)  可以理解为这个等式这种形式  @wrapper 叫做语法糖

    def  funcl(a,b)

      pass

    funcl()

    例题:(不带参数版本)

    def timmer(f): # f = func1
      def inner():
        start_time = time.time()
        f() # func1()
        time.sleep(0.3)
        end_time = time.time()
        print('此函数的执行效率%s' % (end_time - start_time))
      return inner
    # 语法糖@

    @timmer # func1 = timmer(func1)
    def func1():
      print('你有病呀,领导,测试我的执行效率干甚。')

    func1() # inner()

     例题(被装饰函数带参数的版本)

    def timmer(f): # f = func1 函数名
      def inner(*args,**kwargs):
        start_time = time.time()
        f(*args,**kwargs)
        time.sleep(0.3)
        end_time = time.time()
        print('此函数的执行效率%s' % (end_time - start_time))
      return inner

    @timmer # func1 = timmer(func1) # inner
    def func1(a,b):
      print(a,b)
      print('你有病呀,领导,测试我的执行效率干甚。')

    func1(a,b)

    如果能把这个过程理解了就明白了,装饰器的基本流程.

  • 相关阅读:
    numpy函数:[6]arange()详解
    python中的list和array的不同之处
    python 矩阵转置transpose
    PowerDesigner(一)-PowerDesigner概述(系统分析与建模)
    MDX中Filter 与Exist的区别
    SQL Server 2016 —— 聚集列存储索引的功能增强
    SQL Server 2016:内存列存储索引
    PXE
    setjmp
    skb head/data/tail/end/介绍
  • 原文地址:https://www.cnblogs.com/tom2ling/p/8678826.html
Copyright © 2020-2023  润新知