1.4 函数的特殊操作
在前一节定义的函数中,函数的参数和返回值都是变量,实际项目中定义和调用的大多数函数都是如此。不过在实现一些特殊的功能时,需要在定义和调用函数时,把函数作为参数传入或者把函数作为结果返回,或者以匿名的方式来定义和调用函数。
1.4.1 参数是函数
函数的参数不仅可以是数值,也可以是Python内置或编程者自定义的函数。下面的FuncAsParam.py范例程序演示了如何把函数作为参数传入。
本范例程序第1行代码定义的add函数中,它的第3个参数func不是变量,而是一个函数,在add函数第2行的函数主体代码中,先后调用func函数,并将两次调用得到的值求和,然后把加总的结果通过return语句返回给add()函数的调用者。
在第3行调用add()函数时(在第3个参数位置),传入了求绝对值的abs函数,所以它的返回值是abs(2)+abs(5),结果是7。
除了可以传入Python自带的函数作为参数之外,还可以传入编程者自定义的函数作为参数。比如在第6行,传入的参数是第4行定义的求平方的square()函数,所以该用法的返回值是4的平方加5的平方,结果是41。
1.4.2 返回结果是函数
函数除了可以作为参数传入外,还可以作为函数的返回值,下面的FuncAsReturn.py范例程序演示了这一用法。
本范例程序第1行代码定义的getCalFunc函数,它是在第9行把自定义函数calSum返回给getCalFunc函数的调用者。请注意,这里的calSum不是变量,而是函数,该函数的定义在第2行到第8行。
在这种用法中,入参maxNum是由最外层的getCalFunc函数传入到内部的calSum函数里,所以calSum函数内能用到这个值。
在定义完成后,通过第10行的代码调用了getCalFunc函数,并把实现计算求和功能的calSum函数作为返回值赋值给func对象。对于此类把函数作为返回值的程序编写方式,在调用时,需要像第11行那样带括号。如果像第13行那样不带括号,则程序的运行会出现异常。
1.4.3 匿名函数(Lambda表达式)
在定义一些功能比较简单的函数时,可以不必拘泥于定义函数名、函数体和返回值这样的形式,而可以用匿名函数的方式来简化代码。
由于在定义匿名函数时会使用lambda关键字,因此匿名函数也叫Lambda表达式。下面的LambdaDemo.py范例程序演示了如何定义和调用匿名函数。
本范例程序第1行的代码中,通过lambda关键字定义了实现求平方和功能的匿名函数,由于该函数没有函数名,因此叫匿名函数。该函数返回x的平方加y的平方的数值。
相比于定义函数的常规方法,这种定义函数的方法看上去简洁易懂,能很好地提升代码的可读性。在定义匿名函数后,一般会像第1行那样,用变量来接收该匿名函数,比如这里使用calSquareSum变量接收匿名函数。
通过第2行代码能看到调用匿名函数的方式,即calSquareSum(3,4),该函数调用执行的结果是25。第3行代码是定义匿名函数的另一个例子,是求x1、x2和x3的和,并用calSum变量来接收匿名函数。第4行代码调用了第3行定义的匿名函数,执行的结果是12。
注意
在定义和使用匿名函数时需要注意的是,匿名函数只适用于函数功能比较简单的情况,比如上例中函数体只有一句程序代码。如果函数体比较复杂,不建议使用匿名函数。