Python之函数与变量(2)

说明: 这里说的位置参数,其实是指“必选参数”,也就是函数调用时必须要传递的参数,而默认参数是一种有默认值的特殊的位置参数。通常情况下位置参数和默认参数的传递顺序是不能变化的,但是当以指定参数名的方式(如:)传递时参数位置时可以变化的。

不同编程语言对以上几种函数参数的支持各不相同,但是位置参数是最基本的参数类型,基本上所有的编程语言都支持。以下是一个常见编程语言的对比表格(Y表示支持,N表示不支持):

可见只有Python支持全部参数类型,而且只有Python支持关键字参数;另外,C、Java和Go都不支持默认参数,其中Java和Go与它们支持的方法重载特性有关(具体可以看下这个帖子),并且它们可以通过方法重载实现默认参数的功能。

下面我们以一个自定义的打印函数来对以上各种参数进行说明:

1. 位置参数

位置参数,顾名思义是和参数的顺序位置和数量有关的。函数调用时,实参的位置和个数要与形参对应,不然会报错。

函数定义:两个位置参数 def my_print(name, age): print('NAME: %s' % name) print('AGE: %d' % age) 正确调用:参数位置和个数都正确 >>> my_print('Tom', 18) NAME: Tom AGE: 18 错误调用:参数位置不正确 >>> my_print(18, 'Tom') NAME: 18 Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 3, in my_print TypeError: %d format: a number is required, not str 错误调用:参数个数不正确 >>> my_print('Tom') Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: my_print() missing 1 required positional argument: 'age' 2. 默认参数

默认参数:是指给函数的形参赋一个默认值,它是一个有默认值的位置参数。当调用函数时,如果为该参数传递了实参则该形参取实参的值,如果没有为该参数传递实参则该形参取默认值。

默认参数的应用场景:参数值在大部分情况下是固定/相同的。比如这里打印一个班中学生的姓名和年龄,这个班大部分为同龄人(年龄相同),这时我们就可以给“年龄”这个形参赋一个默认的值。

说明: 默认参数只是一个有默认值的位置参数,因此它还是受到位置参数的限制。默认参数可以避免位置参数的一个限制:传递实参的个数,但是参数位置(顺序)仍然还是要一一对应。另外,默认参数必须放在位置参数后面(自己想想为什么)。

函数定义:两个位置参数,后面一个是默认参数(有默认值) def my_print(name, age=12): print('NAME: %s' % name) print('AGE: %d' % age) 正确调用:按照位置参数传值 >>> my_print('Tom', 18) NAME: Tom AGE: 18

age取的是函数调用时传递过来的实参

正确调用:不给age形参传值,age将取默认值 >>> my_print('Tom') NAME: Tom AGE: 12

函数调用时没有给形参age传值,因此age取的是默认值

错误调用:试图跳过前面的位置参数直接给后面的默认参数传值 >>> my_print(18) NAME: 18 AGE: 12

可见,我们明明是想传递18给形参age的,结果18被赋给了name,而age仍然取得是默认值。上面已经提到过,位置参数只是可以让我们少传一些参数,但是不能改变参数的位置和顺序。另外,这也说明了默认参数为什么一定要放在后面:因为实参与形参是从前到后一一有序的对应关系,也就是说在给后面参数传值的时候,不论前面的参数是否有默认值,必须要先给前面的参数先赋值。

错误调用:实参个数超过形参个数 >>> my_print('Tom', 18, 'F') Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: my_print() takes from 1 to 2 positional arguments but 3 were given

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/82f73b1a8d40a964c0644454c0bfacb8.html