zoukankan      html  css  js  c++  java
  • 函数进阶

    函数进阶

    一、命名空间和作用域

    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!

  • 相关阅读:
    Html5新增视频功能——video API 事件
    HTML5新增的视频功能——video属性
    jQuery封装的tab组件(可选自动+可选延迟处理+按需加载)
    jQuery封装tab选项卡组件(自定义自动功能和延迟显示功能)
    jQuery对象只能使用jQuery提供的方法,不能使用原生js提供的方法
    语法糖 —— 糖糖糖
    面向对象
    Call to undefined function IlluminateEncryptionopenssl_cipher_iv_length()
    HTTP协议
    功能算法
  • 原文地址:https://www.cnblogs.com/hzauq/p/7240950.html
Copyright © 2011-2022 走看看