Python之函数与变量(3)

这里要说明的是:默认参数只能相应的减少实参的个数,但是不能增加实参的个数。这个很容易想明白,不做过多解释,只是为下面的可变长(参数)做铺垫。

3. 可变(长)参数

可变(长)参数:顾名思义,是指长度可以改变的参数。通俗点来讲就是,可以传任意个参数(包括0个)。

可变(长)参数的应用场景:通常在写一个需要对外提供服务的方法时,为了避免将来添加或减少什么新的参数使得所有调用该方法的代码点都要进行修改的情况发生,此时就可以用一个可变长的形式参数。

说明: 默认参数允许我们调用函数时,可以少传递一些实参;而可变(长)参数则允许我们调用函数时,可以多传递任意个实参。另外,可变长参数应该定义在默认参数之后,因为调用函数时传递的实参会按照顺序一一赋值给各个形参,如果可变(长)参数定义在前面,那么后面的参数将永远无法取得传递的值。可变(长)参数名称通常用args,且参数名称前要有个"*"号,表示这是一个可变长参数。

函数定义:一个位置参数、一个默认参数、一个可变长参数 def my_print(name, age=12, *args): print('NAME: %s' % name) print('AGE: %d' % age) print(args)

再次强调:位置参数、默认参数、可变长参数在函数定义中的位置不能变。

正确调用:只传递一个实参 >>> my_print('Tom') NAME: Tom AGE: 12 ()

方法调用时,只传递了一个实参,该实参会按照函数中参数的定义位置赋值给形参name,因此name的值为‘Tom’;而形参age没有接收到实参,但是它有默认值,因此它取的是默认值12;需要注意的是可变参数args也没有接收到传递值,但是打印出来的是一对小括号(),说明args参数在函数内部会被转换成tuple(元祖)类型,当没有接收到实参时便是一个空tuple。

正确调用:传递两个实参 >>> my_print('Tom', 18) NAME: Tom AGE: 18 ()

与值传递一个实参的情况基本相同,只是默认参数接收到了传递值,不再取默认值。

正确调用:传递两个以上的实参

比如,现在需要多接收并打印一个人的性别(F: 表示女,M: 表示男),可以这样用:

>>> my_print('Tom', 18, 'F') NAME: Tom AGE: 18 ('F',)

比如,现在需要多接收并打印一个人的性别(F: 表示女,M: 表示男)和籍贯信息,可以这样用:

>>> my_print('Tom', 18, 'F', 'Hebei') NAME: Tom AGE: 18 ('F', 'Hebei')

当然,我们也可以直接将一个tuple或list实例传递给形参args,但是tuple实例前也要加上*号作为前缀:

>>> t = ('F', 'Hebei') >>> my_print('Tom', 19, *t) NAME: Tom AGE: 19 ('F', 'Hebei')

你甚至可以将传递给形参name和age的实参也放到要传递的tuple实例中,但是最好不要这样做,因为很容易发生混乱:

>>> t = ('Jerry', 10, 'F', 'Hebei') >>> my_print(*t) NAME: Jerry AGE: 10 ('F', 'Hebei') 实际应用说明:

由于args接收到实参之后会被转换成一个tuple(元祖)的实例,而tuple本身是一个序列(有序的队列),因此我们可以通过下标(args[n])来获取相应的实参。但是我们需要在函数使用文档中写明args中各实参的传递顺序及意义,并且在获取args中的元素之前应该对args做非空判断。因此函数的定义及调用结果应该是这样的:

函数定义:

def my_print(name, age=12, *args): """ Usage: my_print(name[, age[, sex[, address]]]) :param name: 姓名 :param age: 年龄 :param args: 性别、籍贯 :return: None """ print('NAME: %s' % name) print('AGE: %d' % age) if len(args) >= 1: print('SEX: %s' % args[0]) if len(args) >= 2: print('ADDRESS: %s' % args[1])

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

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