函数进阶

函数进阶

一、命名空间和作用域

1、命名空间

本质:存放名字与值的绑定关系。

加内置命名空间(程序运行前加载)->全局命名空间(程序运行中:从上到下加载)->局部命名空间(程序运行中:调用时才加载)载顺序:

(1)全局命名空间

       打开文件是运行

(2)内置命名空间

       Python程序启动时运行

(3)局部命名空间

        程序内部运行

(4)局部调用

局部命名空间->全局命名空间->内置命名空间

2、作用域

(1)作用

       为了函数内的变量不影响到全局

(2)全局作用域

       全局命名空间、内置命名空间

(3)局部作用域

       局部命名空间

(4)特点

      1、小范围的可以使用大范围的,但是大范围的不能使用小范围的。

      2、小范围类使用变量,优先使用自身的变量,如果没有就使用上一层的,上一层没有就继续向上一层找,以此类推,如果都没有,报错。

二、作用域链与函数嵌套

定义:一个函数中运行到包含在函数中的另一个函数,它们之间形成域链。

(1)nolocal关键字

1、外部必须有这个变量。

2、内部函数在声明nolocal变量之前不能有同名变量。

3、内部修改这个变量在外部有这个变量的第一层有效

三、函数名的本质

本质:函数的内存地址

作用:(1)可以被引用

           (2)可以作为参数的参数和返回值

            (3)可以作为容器类元素

闭包:

闭:内部函数

包:包含了对外部作用域变量的引用

闭包函数:内部函数,包含了对外部作用域变量的引用。

闭包函数的应用

1、装饰器:

目的:不改变函数的调用方式,也不修改原代码的情况下,对函数进行扩展。

原则:开放封闭原则。

      即对扩展是开放的,对修改是封闭的。

装饰器的万能模板

def wrapper(func):
     def inner(*args,**kwargs):
          ret=func(*args,**kwargs)
          return ret
     return inner
@wrapper
def haha():
     print('hello world!')
haha()

2、带参数的装饰器

F=True             #装饰器开关
def outer(flag):   #传参
    def f(func):   #装饰器
        def inner(*args,**kwargs):  #动态传参
            if flag:                #判断条件
                print('before')
                ret=func(*args,**kwargs)   #将调用函数的返回值赋值给ret
                print('after')
            else:
                ret=func(*args,**kwargs)   #将调用函数的返回值赋值给ret
            return ret                    #将调用函数的返回值赋值给inner函数
        return inner                      #将inner返回给调用函数
    return f                        #将装饰器函数的返回给outer函数
@outer(F)                           #装饰器开关
def xhp():                          #被装饰的函数
    print('思密达!')

3、多个装饰器装饰一个函数

def a(func):
    def inner(*args,**kwargs):
        print('in a:before')
        ret=func(*args,**kwargs)
        print('in a:after')
        return ret
    return inner
def b(func):
    def inner(*args,**kwargs):
        print('in b:before')
        ret=func(*args,**kwargs)
        print('in b:after')
        return ret
    return inner
@a
@b
def c():
    print('思密达!')
c()

终于完了,OK!

原文地址:https://www.cnblogs.com/hzauq/p/7240950.html