• python中的闭包


    返回函数

    函数在python中是可以的作为返回值的

    假如原来有这样一个函数

    >>> def cal_sum(*args):
    	s=0
    	for i in args:
    		s+=i
    	return s
    
    >>> cal_sum(1,2,3,4,5)
    15
    

    假如现在不着急立刻求和,向一会儿在计算可以返回函数

    >>> def lazy_sum(*args):
    	def sum():
    		s=0
    		for i in args:
    			s+=i
    		return s
    	return sum
    
    >>> f=lazy_sum(1,2,3,4,5,6)
    >>> f
    <function lazy_sum.<locals>.sum at 0x00000000033F8B70>
    >>> f()
    21
    >>> 
    

    我们通过观察可以发现,定义的sum函数可以使用lazy_sum中传入的参数args,而当lazy_sum函数将sum函数返回给f的时候,f包含了args参数,可以说lazy_sum是将函数sum和参数args一并打包送给了f,这个包叫做闭包

    注意:尽管每次传入的同样的参数,但是最后得到的函数是不一样的

    >>> f1=lazy_sum(1,2,3,4,5,6)
    >>> f2=lazy_sum(1,2,3,4,5,6)
    >>> f1==f2
    False
    

    函数lazy_sum中又定义了函数sum,内部函数sum
    使用外部函数lazy_sum的参数和局部变量

    • 这些定义在外层函数中但由内层函数使用的变量
      被称为自由变量
    • 当lazy_sum返回函数sum时,相关参数和变量都保
      存在返回的函数中(闭包)

    闭包

    闭包遵循的三条规则

    • 必须有内嵌函数(包含在函数内部的函数)
    • 内嵌函数至少使用了外部函数(enclosing function)
      中的一个自由变量
    • 外部函数必须返回内嵌函数

    注意:

    一般情况下,如果一个函数结束,那么该函数中定
    义的局部变量就都会释放。

    • 闭包是一种特殊情况,外层函数在结束时会发现其
    • 定义的局部变量将来会在内层函数中使用,此时外层函数就会把这些自由变量绑定到内层函数。
    >>> def make_inc(x):
    	def inc(y):
    		return x+y
    	return inc
    
    >>> inc5=make_inc(5)
    >>> inc5(6)
    11
    

    闭包的主要作用在于可以封存函数执行的上下文环境。

    • 例如,通过两次调用outer函数形成了两个闭包,这两个闭包具有相互独立的上下文环境(一个闭包中x=5、y=10,另一个闭包中x=50、y=10),且每个闭包可多次调用。
  • 相关阅读:
    xcode6新建pch文件过程
    系统提供的dispatch方法
    iOS 默认Cell选中
    sqoop部署
    maven自动化部署插件sshexec-maven-plugin
    spring-7、Spring 事务实现方式
    Spring-6.1、Java三种代理模式:静态代理、动态代理和cglib代理
    spring-6、动态代理(cglib 与 JDK)
    spring -3、spring 的 IOC与AOP
    Spring-2、Spring Bean 的生命周期
  • 原文地址:https://www.cnblogs.com/mengxiaoleng/p/11549233.html
Copyright © 2020-2023  润新知