《Python语言程序设计》 —3.2.5 不定长参数
3.2.5 不定长参数
不定长参数,即在调用函数时可以接收任意数量的实参,这些实参在传递给函数时会被封装成元组(位置参数)或字典(关键字参数)形式。一般情况下,不定长参数放在形参列表的最后,前面传入的实参与普通形参一一对应,而后面剩余的实参会在被封装成元组或字典后传给不定长参数。对于使用位置参数形式的不定长参数,Python也允许将普通形参放在不定长参数后面,但此时要求在调用函数时必须使用关键字参数方式给不定长参数后面的形参传递实参(对于有默认参数的形参,在调用函数时也可以不传入相应实参)。
带不定长参数的函数的定义方法如下所示:
def 函数名([普通形参列表,] *不定长参数名 [,普通形参列表]):
函数体
或
def 函数名([普通形参列表,] **不定长参数名):
函数体
第一种定义方法使用“*不定长参数名”的方式,表示这个不定长参数对应的是一组位置参数;而第二种定义方法使用“**不定长参数名”的方式,表示这个不定长参数对应的是一组关键字参数。下面通过一个例子来直观地说明两种方式的区别,具体参见代码清单3-6。
代码清单3-6 两种不定长参数使用方法示例
1 def StudentInfo1(name, *args): #定义函数StudentInfo1
2 print('姓名:', name, ',其他:', args)
3 def StudentInfo2(name, **args): #定义函数StudentInfo2
4 print('姓名:', name, ',其他:', args)
5 def StudentInfo3(name, *args, country='中国'): #定义函数StudentInfo3
6 print('姓名:', name, ',国家:', country, ',其他:', args)
7 StudentInfo1('李晓明', '良好', '中国')
8 StudentInfo2('李晓明', 中文水平='良好', 国家='中国')
9 StudentInfo3('李晓明', 19, '良好')
10 StudentInfo3('大卫', 19, '良好', country='美国')
程序执行完毕后,将会输出如下结果:
姓名: 李晓明 ,其他: ('良好', '中国')
姓名: 李晓明 ,其他: {'中文水平': '良好', '国家': '中国'}
姓名: 李晓明 ,国家: 中国 ,其他: (19, '良好')
姓名: 大卫 ,国家: 美国 ,其他: (19, '良好')
下面分别分析代码清单3-6中的3个函数:
对于第1~2行定义的StudentInfo1函数,name是一个普通参数,而args是使用位置参数形式的不定长参数(args前面只有一个“*”)。在第7行调用StudentInfo1函数时,共传入3个实参,其中第一个实参“'李晓明'”传给了形参name,之后的2个实参将封装成一个元组“('良好','中国')”传给不定长参数args。因此,当StudentInfo1函数中使用print函数输出args时,会输出“('良好','中国')”。
对于第3~4行定义的StudentInfo2函数,name是一个普通参数,而args是使用关键字参数形式的不定长参数(args前面有两个“*”)。在第8行调用StudentInfo2函数时,共传入3个实参,其中第一个实参“'李晓明'”传给了形参name,之后的2个关键字参数形式的实参封装成一个字典“{'中文水平':'良好','国家':'中国'}”传给不定长参数args。因此,当StudentInfo2函数中使用print函数输出args时,会输出“{'中文水平':'良好','国家':'中国'}”。
对于第5~6行定义的StudentInfo3函数,name和country是两个普通参数(其中country有默认参数值“'中国'”),而args是使用位置参数形式的不定长参数(args前面仅有1个“*”)。在第9行调用StudentInfo3函数时,共传入3个参数,其中第一个实参“'李晓明'”传给了形参name;后两个实参封装成一个元组“(19,'良好')”传给不定长参数args;形参country在不定长参数args后面,所以必须使用关键字参数形式的实参,但后两个参数中都是使用位置参数形式,即没有给country传入实参值,因此country取默认参数值“'中国'”。
在第10行调用StudentInfo3函数时,共传入4个参数,其中第一个实参“'大卫'”传给了形参name;中间两个实参封装成一个元组“(19,'良好')”传给不定长参数args;最后一个关键字参数形式的实参传给了country,即此时形参country的值为“'美国'”。
注意 如果将调用StudentInfo1和StudentInfo2这两个函数的形式改为
StudentInfo1('李晓明', 中文水平='良好', 国家='中国')
StudentInfo2('李晓明', '良好', '中国')
则运行程序时系统会给出报错信息。这是由于StudentInfo1的args只能接收一组位置参数,如果传入关键字参数就会出错;而StudentInfo2的args只能接收一组关键字参数,如果传入位置参数也会报错。
- 点赞
- 收藏
- 关注作者
评论(0)