闭包函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了闭包函数相关的知识,希望对你有一定的参考价值。

 命名空间

 命名空间也叫做名称空间

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

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

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

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

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

1
2
3
4
5
6
7
8
a=1       #全局变量
def func():
    def func1():
        print(a)
    func1()
    print(a)
func()
print(a)

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

1
2
3
4
5
6
7
8
a=1
def wahaha():
    a=2
    print(a)
def shuangwaiwai():
    print(a)
wahaha()
shuangwaiwai()

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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
# a=0
# def aa():
#     a=1
#     def bb():
#         global a     #global:在局部变量修改全局变量的值
#         a=2
#         print(a)
#     bb()
#     print(a)
# aa()
# print(a)

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 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打印函数名,不加上括号,结果打印出来会是这个函数的内存地址和函数名。

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

1
2
3
def wahaha():
    print(123)
print(wahaha)

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 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)

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

1
2
3
4
5
6
7
# def wahaha():
#     name=‘alex‘
#     def shuangwaiwai():
#         print(name)
#     return shuangwaiwai
# yousanru=wahaha()
# yousanru()

三, 三元表达式

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

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

1
2
3
4
a=10
b=9
c=if a>b else b
print(c)

四 闭包函数

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

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

1
2
3
4
5
6
def wahaha():
    name=‘fang‘
    def shuangwaiwai():    #这个函数就是闭包函数
        print(name)
    shuangwaiwai()
wahaha()

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

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

  

以上是关于闭包函数的主要内容,如果未能解决你的问题,请参考以下文章

JS---闭包

javascript 匿名函数及闭包----转载

Groovy闭包 Closure ( 闭包参数绑定 | curry 函数 | rcurry 函数 | ncurry 函数 | 代码示例 )

Groovy闭包 Closure ( 闭包作为函数参数 | 代码示例 )

Groovy闭包 Closure ( 闭包作为函数参数 | 代码示例 )

JS闭包的概念