zoukankan      html  css  js  c++  java
  • python函数对象和闭包

    关于函数对象和闭包

    闭包(closure)是函数式编程的重要的语法结构。不同的语言实现闭包的方式不同。Python以函数对象为基础,为闭包这一语法结构提供支持的 (我们在特殊方法与多范式中,已经多次看到Python使用对象来实现一些特殊的语法)。Python一切皆对象,函数这一语法结构也是一个对象。在函数对象中,我们像使用一个普通对象一样使用函数对象,比如更改函数对象的名字,或者将函数对象作为参数进行传递。

    一、函数对象:

    1、函数可以当参数传递

    示例:

    #把函数当成参数传递
    def foo():#定义foo函数
        print('foo')
    def bar(foo):
        print(foo)#打印foo的内存地址
        foo()#调用foo函数
    
    bar(foo)
    

    执行结果是:

    <function foo at 0x00000000022EB8C8>
    foo
    

      

    2、函数可以被赋值

    示例:

    def foo():#定义foo函数
        print('foo')
    print(foo)#输出foo的内存地址
    
    f=foo
    print(f)
    f()#即foo()执行foo函数
    

     执行结果是:

    <function foo at 0x00000000003F3E18>
    <function foo at 0x00000000003F3E18>
    foo
    

      

    3、把函数当成返回值

    示例:

    # 把函数当成返回值
    def foo():#定义foo函数
        print('foo')
    def bar(foo):
        print(foo)
        return foo#将foo作为返回值
    f=bar(foo)
    print(f)
    f()
    

    执行结果是:

    <function foo at 0x0000000001FBB8C8>
    <function foo at 0x0000000001FBB8C8>
    foo  

    4、把函数当做容器类型变量(将函数当做容器类型变量,可随时在主轴线上调用)

    示例:

    def tell_msg():
        msg='''
        search:查询
        add:添加
        delete:删除
        change:修改
        create:新建
        '''
        print(msg)

    二、闭包:(定义到内部的函数包括对外部作用域的引用,不包括对全局作用域的引用)

    判断是否为闭包:

    print(f.__closure__),返回值为none的话,则表示不是闭包
    print(f.__closure__[0].cell_contents)按照索引的方式返回闭包的值
    print(f.__closure__[1].cell_contents)按照索引的方式返回闭包的值
  • 相关阅读:
    C#学习之Enum
    Ten MustHave Tools Every Developer Should Download Now
    C#学习之Random
    C#学习之Exception
    WCF Data Contract之KnownType
    ESQL应该注意的地方
    Windows 安全认证是如何进行的?
    十个必备的.NET开发小工具
    c#中判断一个process是32bit还是64bit
    怎么用python和javascript把多张png拼成一个gif
  • 原文地址:https://www.cnblogs.com/xuyuanyuan123/p/6685511.html
Copyright © 2011-2022 走看看