zoukankan      html  css  js  c++  java
  • 函数之名称空间和闭包函数

    一 命名空间

     命名空间也叫做名称空间

     什么内置名称空间:人家直接写好的,我们直接就可以调用的,就叫做内置名称空间

     什么是全局变量:除了函数内部定义的内容外,自己写的代码就叫做全局变量

     什么是局部变量:在函数内部定义的内容,就叫做局部名称空间

    a=1       #全局变量
    def func():
        a=2       #局部变量
        def func1():
            a=3        #局部里的局部变量
            print(a)
        func1()
        print(a)      #print:就属于内置的名称空间
    func()
    print(a)
    

    在全局是不可以直接调用局部的变量,局部变量只能在低于该层和该层的函数去调用,而在局部是可以调用全局的变量的。

    a=1       #全局变量
    def func():
        def func1():
            print(a)
        func1()
        print(a)
    func()
    print(a)
    

     在全局内部可以同时创建多个同等级的局部命名空间,而这些命名空间之间是没有关系的。

    a=1
    def wahaha():
        a=2
        print(a)
    def shuangwaiwai():
        print(a)
    wahaha()
    shuangwaiwai()
    

     对于局部来说,需要调用一个内容时,首先是要在该层寻找,该层有就用该层的,没有就会向全局的方向一层一层的寻找,直到找到了为止。

    加载顺序:启动python——>内置命名空间——>全局命名空间(从上到下加载顺序)——>局部命名空间(调用的时候才开始加载)

     内置命名空间是在任意地方都可以调用;全局命名空间只能是在自己写的代码里使用;局部只能在当前函数里调用。

    global:就是在局部里面修改全局的变量值

    # a=0
    # def aa():
    #     a=1
    #     def bb():
    #         global a     #global:在局部变量修改全局变量的值
    #         a=2
    #         print(a)
    #     bb()
    #     print(a)
    # aa()
    # print(a)
    

    nonlocal:只修改局部的变量值,从该层的上一层一层一层的查找,找到第一个并修改。

    # a=0
    # def aa():
    #     a=1
    #     def bb():
    #         nonlocal a    #nonlocal:修改上一级的局部变量的值
    #         a=2
    #         print(a)
    #     bb()
    #     print(a)
    # aa()
    # print(a)
    
    
    
    
    # a=0
    # def aa():
    #     a = 2
    #     def cc():
    #         def bb():
    #             nonlocal a    #总结:只修改局部的变量值,从该层向外层找到第一个并修改
    #             a=1
    #             print(a)
    #         bb()
    #         print(a)
    #     cc()
    #     print(a)
    # aa()
    # print(a)
    

    先有了作用域,才有了名称空间

     什么是全局作用域链:从调用的那层向外层一层一层的查找需要调用的内容,直到找到第一个,就会停止查找。

    二 函数名

     直接用print打印函数名,不加上括号,结果打印出来会是这个函数的内存地址和函数名。

       函数名就是一个内存地址,相当于就是一个变量。

    def wahaha():
        print(123)
    print(wahaha)
    

       函数名可以赋值,也可以作为其他容器的元素。

    # def func():
    #     print('alex_aa')
    # print(func)
    # a=func
    # print(a)
    # a()
    # l=[func]
    # print(l)
    # l[0]()
    
    
    
    # def alex():
    #     print('ab')
    # def func(aa):
    #     print(aa)
    #     aa()
    # func(alex)
    

       函数名还可以作为函数的返回值或者参数。

    # def wahaha():
    #     name='alex'
    #     def shuangwaiwai():
    #         print(name)
    #     return shuangwaiwai
    # yousanru=wahaha()
    # yousanru()
    

    三, 三元表达式

     三元表达式就是将一些简单的执行语句用更简单的代码写出来

      比如:执行结构=判断语句成立的执行语句   if   判断语句   else   判断语句不成立的执行语句

    a=10
    b=9
    c=a if a>b else b
    print(c)
    

    四 闭包函数

     闭包函数一定要用到嵌套函数

     什么是闭包函数:内部函数引用了外部函数的变量,这个内部函数就叫做闭包函数,闭包就是一种函数

    def wahaha():
        name='fang'
        def shuangwaiwai():    #这个函数就是闭包函数
            print(name)
        shuangwaiwai()
    wahaha()
    

      闭包函数的作用:装饰器是闭包函数的其中的一种应用。

              在变量不会改变的情况下还可以不用重复的创建。

      

    闭包函数的特点:1 自带作用域;2延迟计算

       闭包函数的基本形式:def 外部函数名():

                                     内部函数需要的变量

                                      def  内部函数():                                 

                                             引用外部变量
                                      return   内部函数

                                                           
      使用闭包函数需要注意的是:因为闭包的概念就是有内部的函数而来的,所以不能在外部函数以外的地方对内部函数进行调用。

      python3以前并没有直接的解决方案,只能间接性通过容器来进行存放因为容器类型没有放在栈内,所以你会屏蔽掉。字符串,列表,元组等等都可以往里面存放的就是容器类型。 

      在闭包中,外部函数的局部变量对应内部函数的局部变量,意思就是全局变了和局部变量的对应关系,在内部函数中,只能对外部函数进行调用,而不能进行修改。

      如果希望在内部函数里修改外部函数的局部变量的值,也是会有方法的,那就是nonlocal,使用方法和global一样。

      

  • 相关阅读:
    Search a 2D Matrix
    binary search bug
    Find Minimum in Rotated Sorted Array II
    Search in Rotated Sorted Array 【新思路】
    Find Peak Element
    Find Minimum in Rotated Sorted Array
    DFS判断连通图
    分支限界法解决01背包问题
    python中ndarray和matrix
    python对数组缺失值进行填充
  • 原文地址:https://www.cnblogs.com/fangjie0410/p/7453757.html
Copyright © 2011-2022 走看看