函数调用及结果:
>>> my_print('Tom') NAME: Tom AGE: 12 >>> my_print('Tom', 18) NAME: Tom AGE: 18 >>> my_print('Tom', 18, 'F') NAME: Tom AGE: 18 SEX: F >>> my_print('Tom', 18, 'F', 'Hebei') NAME: Tom AGE: 18 SEX: F ADDRESS: Hebei >>> t = ('F', 'Hebei') >>> my_print('Tom', 19, *t) NAME: Tom AGE: 19 SEX: F ADDRESS: Hebei 4. 关键字参数关键字参数:顾名思义,是指调用函数时通过关键字来指定是为哪个形参指定的实参,如name="Tom", age=10。
说明: 这个地方很容易发生思维混淆,所以需要特别说明一下:这里所说的关键字参数可以理解为以key=value的形式传递给函数的实参,注意是实参不是函数定义时声明的形参。而且在函数调用时可以通过关键字参数给函数定义时所声明的位置参数和默认参数传值(但是不能通过关键参数给可变长参数*args传值)。如果想实现像可变长参数那样在函数调用时传递任意个关键字参数给函数,则需要在函数定义时声明一个接受“可变长关键词参数”的形参,该形参名称通常为kwargs,且前面需要带"**"前缀--**kwargs。
关键字参数应用场景:关键字参数一方面可以允许函数调用时传递实参的顺序与函数定义时声明形参的顺序不一致,提高灵活性;另一方面,它弥补了可变长参数的不足。想一下,如果想为上面定义了可变长参数的函数只传递“籍贯”参数就必须同时传递“性别”参数;另外还要不断地判断tuple的长度,这是相当不方便的。而关键参数可以通过关键字来判断某个参数是否有传递值并获取该参数的实参值。
函数定义:位置参数、默认参数、可变(长)参数、关键字参数 def my_print(name, age=12, *args, **kwargs): print('NAME: %s' % name) print('AGE: %d' % age) print(args) print(kwargs) 正确调用:只传递一个实参 >>> my_print('Tom') NAME: Tom AGE: 12 () {}方法调用时,只传递了一个实参,该实参会按照函数中参数的定义位置赋值给形参name,因此name的值为‘Tom’;而形参age没有接收到实参,但是它有默认值,因此它取的是默认值12;可变参数args也没有接收到传递值,因此args的值是一个空元组;重点需要注意的是关键字参数kwargs也没有接收到传递值,但是其打印值为一个空字典(dict)实例。
正确调用:传递两个实参 >>> my_print('Tom', 18) NAME: Tom AGE: 18 () {}与值传递一个实参的情况基本相同,只是默认参数接收到了传递值,不再取默认值。
>>> my_print(age=18, name='Tom') NAME: Tom AGE: 18 () {}可以不按照形参声明的顺序传递实参
正确调用:传递两个以上的实参以非key=value的形式传递所有参数:
>>> my_print('Tom', 18, 'F', 'Hebei') NAME: Tom AGE: 18 ('F', 'Hebei') {}可见后面多余的两个实参都传递给了可变长参数args
最后一个addr参数以key=value的形式传递:
>>> my_print('Tom', 18, 'F', addr='Hebei') NAME: Tom AGE: 18 ('F',) {'addr': 'Hebei'} >>>最后两个参数sex和addr都以key=value的形式传递:
>>> my_print('Tom', 18, sex='F', addr='Hebei') NAME: Tom AGE: 18 () {'sex': 'F', 'addr': 'Hebei'}