Python基础--函数的嵌套和闭包

1、名称空间和做用域

名称空间:Python全部有关命名的操做都是在操做名称空间,例如变量名,函数名
    一、内置名称空间:Python解释器提供好的功能,解释器启动跟着一块儿启动,是全局做用域
    二、全局名称空间:Python中顶行写的,不在函数内部定义的,都是全局名称空间,在运行的时候会产生名称空间,是全局做用域
    三、局部名称空间:在一个小范围定义,只能当前范围及其子空间内运行,例如在函数内部定义的,是局部做用域

2、函数的嵌套

一、函数的嵌套调用
二、函数的嵌套定义
x = 1111111111111111
def f1():
    #x=1
    print('------>f1 ',x)
    def f2():
        #x = 2
        print('---->f2 ',x)
        def f3():
            x=3
            print('-->f3 ',x)
        f3()     
    f2()
f1()

3、函数的使用

一、函数能够被当作变量赋值
def foo():
    print("foo")
print(foo)          #打印foo的内存地址空间,函数的名字在不带小括号时表示的是函数的内存地址
f=foo               #把foo的内存地址空间作值赋值给f变量
print(f)            #打印f,起始就是打印foo的内存地址空间
f()                 #f()事实上就是执行foo函数,等同于foo()


打印结果为
<function foo at 0x0000000000B91378>    #print(foo)的结果
<function foo at 0x0000000000B91378>    #print(f)的结果
foo                                     #执行f()的结果,实际就是执行foo()的结果

二、函数能够当作参数传递闭包

def foo():
    print("foo")
print(foo)          #打印foo的内存地址空间
f=foo               #把foo的内存地址空间作值赋值给f变量
print(f)            #打印f,起始就是打印foo的内存地址空间
f()                 #f()事实上就是执行foo函数,等同于foo()

def bar(func):
    print(func)     #这个是打印foo()函数的内存地址
    func()          #func是foo的内存地址,加()实际就是执行foo()函数
    return func
f = bar(foo)        #这个是获取bar的返回值
print(f)            #打印f,就是打印bar()的返回值,就是foo()的内存地址,和print(func)相同
f()                 #f是bar

def bar(func):
    print(func)

bar(foo())      #这个是先执行foo()行数,执行函数里的代码,先打印foo,而后把foo()的返回值做为bar()函数的实参传递给bar,foo()没有返回值,因此是None
                #结果就是先输出一个  "foo"     而后bar(None),把none传递给bar()函数,打印No

4、闭包:内部函数的代码包含对外部做用域的引用,但必定不是对全局做用域的引用,闭包函数必定有__closure__方法

x=1
def f1():
    x=2
    y=3
    def f2():
        print(x)
        y
    return f2
f=f1()                  #f是f2的内存地址
f()                     #f()就是f2(),能够保证f2()能够在任何位置执行,而不受做用域的限制
print(f.__closure__)    #打印结果是元组,元组个数表明的是闭包所引用的上次函数的元素个数
print(f.__closure__[0]) #结果是元组,能够使用索引的方式查看
print(f.__closure__[0].cell_contents)   #查看指定元组所对应的应用上层参数的值
def init(func):
    def wrapper(*args,**kwargs):
        res=func(*args,**kwargs)
        return res
    return wrapper
相关文章
相关标签/搜索