函数之名称空间和闭包函数

一 命名空间

 命名空间也叫做名称空间

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

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

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

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一样。

  

原文地址:https://www.cnblogs.com/fangjie0410/p/7453757.html