Python/函数的嵌套和闭包

Posted

tags:

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

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

一、名称空间和作用域

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

二、函数的嵌套

1、函数的嵌套调用
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()

三、函数的使用

1、函数可以被当做变量赋值
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()的结果

2、函数可以当做参数传递

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

四、闭包:内部函数的代码包含对外部作用域的引用,但一定不是对全局作用域的引用,闭包函数一定有__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
    
    

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

013.Python之函数嵌套名称空间与作用域闭包函数

Python中的闭包

Python/函数的嵌套和闭包

5.初识python装饰器 高阶函数+闭包+函数嵌套=装饰器

python闭包和装饰器的理解

python函数嵌套以及闭包的原理