Python函数的参数

目录
  1. 1. Positional arguments位置参数
  2. 2. Keyword arguments关键字参数
  3. 3. Variable-length argument可变数量参数
    1. 3.1. 处理任意数目的位置参数
    2. 3.2. 处理任意数目的关键字参数
  4. 4. Mixing argument-passing techniques混合参数

作者:杨冬 欢迎转载,也请保留这段声明。谢谢!
出处:https://andyyoung01.github.io/http://andyyoung01.16mb.com/

各种语言都有它自己特定的函数参数定义方法。Python对于函数参数的定义非常灵活,它提供了三种定义函数参数的方式。

1. Positional arguments位置参数

这是Python中最简单的给函数传递参数的方式。当调用函数时,调用代码中的函数参数与函数定义时的参数的顺序一致。例如:

1
2
3
4
5
6
7
8
9
>>> def power(x, y):
... r = 1
... while y > 0:
... r = r * x
... y = y - 1
... return r
...
>>> power(3, 4)
27

上述代码中,调用函数时3->x,4->y。也可以在定义函数时,给函数参数指定默认值,类似于下面这样:

1
def fun(arg1, arg2=default2, arg3=default3, . . .)

包含有默认值的函数参数,必须在函数参数列表的最后面的位置。如果上面的函数定义中arg1也包含默认值的话,所有后面的参数都应该包含默认值。
在调用时,如果没有指定带默认值的函数参数,则使用参数中的默认值。例如调用上面的函数时,通过fun(1)这种方式调用时,1->arg1,arg2=default2,arg3=default3;通过fun(1,2,3)这种方式调用时,1->arg1,2->arg1,3->arg3。

2. Keyword arguments关键字参数

可以在调用函数时,使用相应函数参数的名称来传递参数。例如还是上面power函数的定义,在调用时,通过如下方式:

1
2
>>> power(y=2, x=3)
9

上面的函数调用,因为使用了函数参数的名称来传递参数,所以参数的位置便无关紧要了。

3. Variable-length argument可变数量参数

Python的函数也可以处理可变数量的函数参数。可以有两种方式:

3.1. 处理任意数目的位置参数

在函数的参数列表中,最后一个参数前添加一个*号,便可以将传入该函数的多余的参数存在以该参数命名的元组中。例如,有如下函数定义:

1
2
3
4
5
6
7
8
9
>>> def maximum(*numbers):
... if len(numbers) == 0:
... return None
... else:
... maxnum = numbers[0]
... for n in numbers[1:]:
... if n > maxnum:
... maxnum = n
... return maxnum

通过如下方式调用:

1
2
3
4
>>> maximum(3, 2, 8)
8
>>> maximum(1, 5, 9, -2, 2)
9

3.2. 处理任意数目的关键字参数

在函数的参数列表中,最后一个参数前添加一个**号,便可以将传入该函数的多余的关键字参数存在以该参数命名的字典中。例如,有如下函数定义:

1
2
3
4
5
6
7
>>> def example_fun(x, y, **other):
... print("x: {0}, y: {1}, keys in 'other': {2}".format(x,
... y, list(other.keys())))
... other_total = 0
... for k in other.keys():
... other_total = other_total + other[k]
... print("The total of values in 'other' is {0}".format(other_total))

通过如下方式调用:

1
2
3
>>> example_fun(2, y="1", foo=3, bar=4)
x: 2, y: 1, keys in 'other': ['foo', 'bar']
The total of values in 'other' is 7

4. Mixing argument-passing techniques混合参数

可以混合上面的3种方式定义函数,只要可变长度的函数参数定义在函数参数列表的最后。例如:

1
2
3
4
5
# Accept variable number of positional or keyword arguments
def spam(*args, **kwargs):
# args is a tuple of positional args
# kwargs is dictionary of keyword args
...