Python 关键字参数和可变参数
关键字参数
如果你有一些具有许多参数的函数,而你又希望只对其中的一些进行指定,那么你可以通过命名它们来给这些参数赋值——这就是python关键字参数(Keyword Arguments)——我们使用命名(关键字)而非位置(一直以来我们所使用的方式)来指定函数中的参数。
这样做有两大优点——其一,我们不再需要考虑参数的顺序,函数的使用将更加容易。其二,我们可以只对那些我们希望赋予的参数以赋值,只要其它的参数都具有默认参数值。
案例(保存为 function_keyword.py
):
def func(a, b=5, c=10): print('a is', a, 'and b is', b, 'and c is', c) func(3, 7) func(25, c=24) func(c=50, a=100)
输出:
$ python function_keyword.py a is 3 and b is 7 and c is 10 a is 25 and b is 5 and c is 24 a is 100 and b is 5 and c is 50
它是如何工作的
名为 func
的函数有一个没有默认参数值的参数,后跟两个各自带有默认参数值的参数。
在第一次调用python函数时,func(3, 7)
,参数 a
获得了值 3
,参数 b
获得了值 7
,而 c
获得了默认参数值 10
。
在第二次调用函数时,func(25, c=24)
,由于其所处的位置,变量 a
首先获得了值 25。然后,由于命名——即关键字参数——指定,变量 c
获得了值 24
。变量 b
获得默认参数值 5
。
在第三次调用函数时,func(c=50, a=100)
,我们全部使用关键字参数来指定值。在这里要注意到,尽管 a
在 c
之前定义,但我们还是在变量 a
之前指定了变量 c
有时你可能想定义的函数里面能够有任意数量的变量,也就是参数数量是可变的,这可以通过使用星号来实现(将下方案例保存为 function_varargs.py
):
def total(a=5, *numbers, **phonebook): print('a', a) #遍历元组中的所有项目 for single_item in numbers: print('single_item', single_item) #遍历字典中的所有项目 for first_part, second_part in phonebook.items(): print(first_part,second_part) print(total(10,1,2,3,Jack=1123,John=2231,Inge=1560))
输出:
$ python function_varargs.py a 10 single_item 1 single_item 2 single_item 3 Inge 1560 John 2231 Jack 1123 None
它是如何工作的
当我们声明一个诸如 *param
的星号参数时,从此处开始直到结束的所有位置参数(Positional Arguments)都将被收集并汇集成一个称为“param”的元组(Tuple)。
类似地,当我们声明一个诸如 **param
的双星号参数时,从此处开始直至结束的所有关键字参数都将被收集并汇集成一个名为 param
的字典(Dictionary)。