11.4 传递函数

当学习一门C这样的语言时,函数指针的概念是一个高级话题,但是对于函数就像其他对象的Python来说就不是那么回事了。函数是可以被引用的(访问或者以其他变量作为其别名),也作为参数传入函数,以及作为列表和字典等容器对象的元素函数有一个独一无二的特征使它同其他对象区分开来,那就是函数是可调用的。举例来说,可以通过函数操作来调用他们(在Python中有其他的可调用对象。更多信息,参见14章)。

在以上的描述中,我们注意到可以用其他的变量来作为函数的别名。

因为所有的对象都是通过引用来传递的,函数也不例外。当对一个变量赋值时,实际是将相同对象的引用赋值给这个变量。如果对象是函数的话,这个对象所有的别名都是可调用的。

11.4 传递函数 - 图1

当我们把foo赋值给bar时,bar和foo引用了同一个函数对象,所以能以和调用foo()相同的方式来调用bar()。确定你明白“foo”(函数对象的引用)和“foo()”(函数对象的调用)的区别。

稍微深入下我们引用的例子,我们甚至可以把函数作为参数传入其他函数来进行调用。

11.4 传递函数 - 图2

注意到函数对象foo被传入到bar()中。bar()调用了foo()(用局部变量argfunc来作为其别名就如同在前面的例子中我们把foo赋给bar一样)。现在我们来研究下一个更加实际的例子,numconv.py,代码在例子11.3中给出。

一个将函数作为参数传递,并在函数体内调用这些函数,更加实际的例子。这个脚本用传入的转换函数简单将一个序列的数转化为相同的类型。特别地,test()函数传入一个内建函数int()、long()或float()来执行转换。

例11.3 传递和调用(内建)函数(numConv.py)

11.4 传递函数 - 图3

11.4 传递函数 - 图4

如果我们运行这个程序,我们将会得到如下输出:

11.4 传递函数 - 图5