返回函数所谓返回函数,顾名思义就是把函数作为返回值。除了将函数作为参数,高阶函数还可以将函数作为结果返回。让我们实现可变参数的乘法。求积函数可以定义为:defcalc_fac(*args):fx=0forninargs:fx=fx*nreturnfx很多时候定义求积函数的时候,我们并不需要立即计算乘积,但是会根据后面的计算再次调用。这时候我们可以不返回函数的结果,而是返回函数本身,如下所示:deflazy_fac(*args):deffac():fx=0forninargs:fx=fx*nreturnfxreturnfac重新定义求积函数后,当我们调用lazy_fac()时,返回的不是求积的结果,而是求积函数:>>>a=lazy_fac(1,2,3,4)>>>a.facat0x002a5dr42>调用函数a时,执行正交过程:>>>a()24本例中,我们在函数lazy_fac中定义了函数fac,fac可以称为内部函数,而lazy_fac是外部函数。内层函数fac可以引用外层函数的参数和局部变量。参数和变量都保存在我们最后返回的内部函数fac中。这种程序结构在Python中称为闭包。在闭包结构中,当函数作为结果返回时,函数过程并不是立即执行,而是在我们调用a()之后执行。总之,在函数式编程中,函数除了返回一个计算结果,还可以返回一个未执行的函数。返回函数时,时刻牢记函数还没有执行,尽量不要引入循环变量等可能导致返回函数发生变化的变量。匿名函数当我们传入一个函数或者代码结构过于复杂时,我们可以使用匿名函数来代替显式的函数定义。这时候匿名函数会大大简化代码结构,可以让它更加精炼。以前面介绍的map函数为例,计算x3,看看匿名函数的作用:>>>list(map(lambdax:x*x*x,[1,2,3]))[1,8,27]对比可以看出,匿名函数lambdax:x*x*x等价于:deff(x):returnx*x*xlambda作为匿名函数的关键字,而冒号前的x代表匿名函数的参数。一个匿名函数只能有一个表达式,不需要像定义函数那样写return。因为匿名函数没有函数名,所以在使用过程中不用担心函数名冲突。作为函数对象,匿名函数也符合给变量赋值的规则:>>>fx=lambdax:x*x*x>>>fxat0x101c6ef28>>>>f(4)64也是一样,作为函数的匿名函数也可以看成是返回函数:deff(x):returnlambda:x*x*x