zoukankan      html  css  js  c++  java
  • 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
        
        
    
    
  • 相关阅读:
    [Zjoi2014]力(FFT,卷积)
    LOJ 6240. 仙人掌
    Web 服务编程技巧和诀窍: 将 <xsd:any/> 元素用于自定义序列化(转)
    Ant工具使用说明(转)
    Web 服务编程技巧与窍门: 用 SAAJ 和 JAXRPC 构建 SOAP 响应信封(转)
    Axis2 quick start 中文版
    使用SOAP开发java web服务Axis开发方案(转)
    k 动画脚本很有算法 同时可以借鉴这里的画圆
    ui 界面美观化 (多维子材质脚本)
    系类函数介绍 之中可能没有一些预订变量 应用时要自己加上。
  • 原文地址:https://www.cnblogs.com/baomanji/p/6701981.html
Copyright © 2011-2022 走看看