2.17 函数

类似于其他语言,Python中的函数使用小括号(())调用。函数在调用之前必须先定义。如果函数中没有return语句,就会自动返回None对象。

Python是通过引用调用的。这意味着函数内对参数的改变会影响到原始对象。不过事实上只有可变对象会受此影响,对不可变对象来说,它的行为类似按值调用。

2.17.1 如何定义函数

2.17 函数 - 图1

定义一个函数的语法由def关键字及紧随其后的函数名,再加上该函数需要的几个参数组成。函数参数(比较上面例子中的arguments)是可选的,这也是为什么把它们放到中括号中的原因。(在你的代码里千万别写上中括号!)这个语句由一个冒号(:)结束(与if和while语句的结束方式一样),之后是代表函数体的代码组,下面是一个简短的例子。

2.17 函数 - 图2

这个函数,做的是“在我的值上加我”的工作。它接受一个对象,将它的值加到自身,然后返回和。对于数值类型参数,它的结果是显而易见的,不过我要在这里指出,加号操作符几乎与所有数据类型工作。换句话说,几乎所有的标准数据类型都支持+操作符,不管是数值相加还是序列合并。

2.17.2 如何调用函数

2.17 函数 - 图3

Python语言中调用函数与在其他高级语言中一样,为函数名加上函数操作符——一对小括号。括号之间是所有可选的参数。即使一个参数也没有,小括号也不能省略。注意一下,+操作符在非数值类型中如何工作。

2.17.3 默认参数

函数的参数可以有一个默认值,如果提供有默认值,在函数定义中,参数以赋值语句的形式提供。事实上这仅仅是提供默认参数的语法,它表示函数调用时如果没有提供这个参数,它就取这个值作为默认值。

2.17 函数 - 图4

在上面的例子里,debug参数有一个默认值True。如果我们没有传递参数给函数foo(), debug自动拿到一个值True。在第二次调用foo()时,我们故意传递一个参数False给foo(),这样,默认参数就没有被使用。函数拥有的特性远比我们在这里介绍的多,请阅读第11章以了解更详细的函数的信息。