Python 函数可变参数
您可能希望定义一个函数,能够接受任意数量的参数。而且,这些参数的数量可以是位置参数或关键字参数。
- 使用单个星号
*
作为前缀,表示可变的位置参数。 -
使用两个星号
**
作为前缀,表示可变的关键字参数。
示例 1
下面是一个可变长度的位置参数的示例-
# sum of numbers
def add(*args):
s=0
for x in args:
s=s+x
return s
result = add(10,20,30,40)
print (result)
result = add(1,2,3)
print (result)
args变量在前面加上”*”表示它存储了传递给它的所有值。在这里,args变成了一个tuple。我们可以通过循环遍历它的元素来相加这些数字。
它将产生以下 输出 −
100
6
也可以在变量数量的序列之前有一些必需的参数的函数。
示例 2
以下示例中有一个 avg() 函数。假设一个学生可以参加任意数量的测试。第一次测试是必需的。他可以参加任意多次测试以提高分数。该函数计算第一次测试的平均分和其余测试中的最高分。
该函数有两个参数,第一个是必需的参数,第二个是用来保存任意数量的值。
#avg of first test and best of following tests
def avg(first, *rest):
second=max(rest)
return (first+second)/2
result=avg(40,30,50,25)
print (result)
以下对avg()函数的调用将第一个值传递给所需参数first,将剩余的值传递给名为rest的元组。然后我们找到最大值并用它计算平均值。
它将产生以下 输出 −
45.0
如果参数列表中的变量前面有两个星号,函数可以接受任意数量的关键字参数。该变量将变成一个关键字:值对的字典。
示例 3
下面的代码是一个具有任意关键字参数的函数的示例。addr()函数有一个参数**kwargs,可以接受任意数量的地址元素,如姓名、城市、电话号码、邮政编码等。在函数内部,使用items()方法遍历kwargs字典中的kw:value对。
def addr(**kwargs):
for k,v in kwargs.items():
print ("{}:{}".format(k,v))
print ("pass two keyword args")
addr(Name="John", City="Mumbai")
print ("pass four keyword args")
# pass four keyword args
addr(Name="Raam", City="Mumbai", ph_no="9123134567", PIN="400001")
它将产生以下的 输出 −
pass two keyword args
Name:John
City:Mumbai
pass four keyword args
Name:Raam
City:Mumbai
ph_no:9123134567
PIN:400001
如果函数使用混合类型的参数,那么任意关键字参数应该位于位置参数、关键字参数和任意位置参数之后。
示例 4
想象一种情况,科学和数学是必修科目,此外学生还可以选择任意数量的选修科目。
以下代码定义了一个 percent() 函数,其中科学和数学的成绩存储在必需的参数中,而可选参数中存储了可变数量的选修科目的成绩。
def percent(math, sci, **optional):
print ("maths:", math)
print ("sci:", sci)
s=math+sci
for k,v in optional.items():
print ("{}:{}".format(k,v))
s=s+v
return s/(len(optional)+2)
result=percent(math=80, sci=75, Eng=70, Hist=65, Geo=72)
print ("percentage:", result)
它将产生以下输出 −
maths: 80
sci: 75
Eng:70
Hist:65
Geo:72
percentage: 72.4