美文网首页
【Python】-017-函数-闭包

【Python】-017-函数-闭包

作者: 9756a8680596 | 来源:发表于2017-08-11 00:00 被阅读14次

关于函数式编程思考

  • 闭包——嵌套在内部的函数声明,同时声明的函数作为返回值
  • 高级函数——filtermapreduce,函数的参数迭代操作
  • lambda——匿名函数
  • callback——在函数作为唯一参数,内部调用其他函数,调用后返回当前函数体
  • 函数式编程,函数作为普通变量,可做参数,可返回,可嵌套,可匿名,可迭代
  • 闭包可以被理解为一个只读的对象,你可以给他传递一个属性,但它只能提供给你一个执行的接口
  • 闭包和类有点相似,相似点在于他们都提供了对数据的封装,不同的是闭包本身就是个方法。

闭包结构特征

  • 嵌套结构

  • 内部函数用到外部函数变量

  • 外部函数返回值为内部函数

  • 例子

    def pow_x(x):
        def echo(value):
            return value**x
        return echo
    
    lst = [pow_x(2), pow_x(3), pow_x(4)]
    for p in lst:
        print p
        print p(3)  // pow_x(2)(3), pow_x(3)(3), pow_x(4)(3) 
    
  • 内部函数改变外部函数变量,思考闭包函数的变量作用域

    # coding: utf-8
    
    def pow_y(x):
        def echo(value):
    ##        x[0] = x[0]*2  //在内部函数将外部的x某一个值进行修改,并没有变更x的引用
    ##        x = [2, 3]  //这里将外部函数的x变成了局部变量
            return value**x[0], value**x[1]
    
        return echo
    
    lst2 = pow_y([1, 1])
    print lst2(2)
    print lst2(3)
    print lst2(4)
    
  • 从外部修改变量的值,对比上一个例子体会下差别

    def larger(x):
        def echo(value):
            print "value:",value, "x:", x, "x[0]:", x[0], "type(x)", type(x)
            return True if value > x[0] else False
        return echo
    
    x=[10]
    larger10 = larger(x)
    print x[0], larger10(2)
    
    x[0] = 1
    print x[0], larger10(2)
    
    x = 100  ## 此处的x并不会变更闭环环境中的x,闭包中的x并没有被回收
    ##  larger10 = larger(x) 重新生成闭包环境,所以会报错
    print type(x), larger10(2)
    
  • 闭包只是在形式和表现上像函数,但实际上不是函数。函数是一些可执行的代码,这些代码在函数被定义后就确定了,不会在执行时发生变化,所以一个函数只有一个实例。闭包在运行时可以有多个实例,不同的引用环境和相同的函数组合可以产生不同的实例。

  • 外部函数的局部变量可以被内部函数引用,即使外部函数已经返回了。

    def generate_power_func(n):
        print "id(n): %X" % id(n)
        def nth_power(x):
            return x**n
        print "id(nth_power): %X" % id(nth_power)
        return nth_power
    
    print generate_power_func(4)
    print generate_power_func(4)(2)  #闭包实例中包含的变量不会被回收
    

参考文献:
1.浅显理解 Python 闭包
2.闭包的概念、形式与应用
3.Python 的闭包和装饰器
4.python中的闭包
5.Python中的闭包

相关文章

  • 【Python】-017-函数-闭包

    关于函数式编程思考 闭包——嵌套在内部的函数声明,同时声明的函数作为返回值 高级函数——filter,map和re...

  • python函数之闭包

    目录 python函数之闭包什么是闭包python中的namespace闭包的条件闭包的优点 python函数之闭...

  • 2018-11-20

    python函数的闭包 闭包: 嵌套函数调用外部函数的变量 注意: 闭包必须是内部函数调用外部函数定义的变量,这其...

  • python之理解闭包和装饰器

    python之理解闭包和装饰器 1、闭包函数 1.1 python中函数都是对象 结果: 上面定义一个shut函数...

  • Python 闭包使用注意点

    1 Python 闭包 今天,聊下 python 的闭包。在函数编程中经常用到闭包。 闭包是什么,它是怎么产生的及...

  • Python闭包与ObjC的block的区别与联系

    首先明确一下Python闭包和ObjC中block的定义在python中闭包是这么定义的——内层函数引用了外层函数...

  • Python中的闭包

    php对闭包的定义是匿名函数,我之前对python闭包的理解是:外部函数以内部函数作为返回值,称之为闭包!!!(错...

  • Python 闭包与装饰器图解

    python万物皆对象! 闭包 闭包:两个函数的嵌套,外部函数返回内部函数的引用,外部函数一定有参数 def 外部...

  • Python 进阶语法

    高阶函数 python 的高阶函数非常 Nice,高级函数的核心就是闭包{},闭包就可以把一段{}包裹的代码当成对...

  • Python装饰器(Decorator)完全指南-基础篇

    Decorator基本指南 前提知识 Python中的闭包(closure) 所谓闭包,指的是附带数据的函数对象。...

网友评论

      本文标题:【Python】-017-函数-闭包

      本文链接:https://www.haomeiwen.com/subject/zpgcrxtx.html