derezzed

导航

python函数之闭包

def function():
    name = 'eva'
    def inner():
        print(name)
'''
闭包函数:
内部函数包含对外部作用域而非全剧作用域名字的引用,该内部函数称为闭包函数
#函数内部定义的函数称为内部函数

'''
'''
由于有了作用域的关系,我们就不能拿到函数内部的变量和函数了。如果我们就是想拿怎么办呢?返回呀!

我们都知道函数内的变量我们要想在函数外部用,可以直接返回这个变量,那么如果我们想在函数外部调用函数内部的函数呢?

是不是直接就把这个函数的名字返回就好了?

这才是闭包函数最常用的用法
'''
def func():
    name = 'eva'
    def inner():
        print(name)
    return inner
f = func()
f()

# 判断闭包函数的方法_closure_

#输出的__closure__有cell元素 :是闭包函数

def func():
    name = 'eva'
    def inner():
        print(name)
    print(inner.__closure__)
    return inner


f = func()
f()

#输出的__closure__为None :不是闭包函数

name = 'egon'
def func2():
    def inner():
        print(name)
    print(inner.__closure__)
    return inner


f2 = func2()
f2()




print('*'*100)


def wrapper():
    money = 1000
    def func():
        name = 'eva'
        def inner():
            print(name,money)
        return inner
    return func

f = wrapper()
i = f()
i()

命名空间:

  一共有三种命名空间从大范围到小范围的顺序:内置命名空间、全局命名空间、局部命名空间

作用域(包括函数的作用域链):

小范围的可以用大范围的
但是大范围的不能用小范围的
范围从大到小(图)

在小范围内,如果要用一个变量,是当前这个小范围有的,就用自己的
如果在小范围内没有,就用上一级的,上一级没有就用上上一级的,以此类推。
如果都没有,报错

函数的嵌套:

  嵌套调用

  嵌套定义:定义在内部的函数无法直接在全局被调用

函数名的本质:

  就是一个变量,保存了函数所在的内存地址

闭包:

  内部函数包含对外部作用域而非全剧作用域名字的引用,该内部函数称为闭包函数



posted on 2018-01-17 22:50  derezzed  阅读(146)  评论(0)    收藏  举报