任意数量的参数(*args) 您可能想要定义一个能够接受任意数量参数的函数。此外,任意数量的参数可能是位置参数或者是关键字参数。
一个带单个星号*前缀的参数表示任意数量的位置参数。
一个带两个星号**前缀的参数表示任意数量的关键字参数。
任意数量参数的示例
下面是一个关于任意长度的位置参数的例子:
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
变成了一个元组。我们可以遍历它的元素来加总这些数字。
它将产生如下的输出:
100
6
带有任意参数的必填参数
也可以定义一个函数,其中有一些必填参数,然后是一系列可变数量的值。
示例
下面的例子中有avg()
函数。假设学生可以参加任意数量的测试。第一次测试是强制性的。他可以参加尽可能多的测试以提高分数。该函数计算第一次测试的成绩和他的其余测试中的最高分的平均值。
该函数有两个参数,第一个是必填参数,第二个是用来存放任意数量的值。
def avg(first, *rest):
second = max(rest)
return (first + second) / 2
result = avg(40, 30, 50, 25)
print(result)
对avg()
函数的调用把第一个值传递给必填参数first
,剩下的值传递给一个名为rest
的元组。然后我们找到最大值并用它来计算平均分。
它将产生如下的输出:
45.0
任意数量的关键字参数(**kwargs)
如果参数列表中的某个变量前面有两个星号**,那么函数可以接受任意数量的关键字参数。该变量成为一个包含关键字:值对的字典。
示例
下面的代码是一个带有任意关键字参数的函数的例子。addr()
函数有一个参数**kwargs
,它可以接受任何数量的地址元素,比如名字、城市、电话号码、邮政编码等。在函数内部,使用items()
方法遍历kwargs
字典中的键值对。
def addr(**kwargs):
for k, v in kwargs.items():
print("{}:{}".format(k, v))
print("传递两个关键字参数")
addr(Name="John", City="Mumbai")
print("传递四个关键字参数")
addr(Name="Raam", City="Mumbai", ph_no="9123134567", PIN="400001")
它将产生如下的输出:
传递两个关键字参数
Name:John
City:Mumbai
传递四个关键字参数
Name:Raam
City:Mumbai
ph_no:9123134567
PIN:400001
带有任意关键字参数的多种参数
如果函数使用了多种类型的参数,那么在参数列表中,任意关键字参数应该位于位置参数、关键字参数和任意位置参数之后。
示例
想象一种情况,科学和数学是必修科目,除此之外,学生还可以选择任意数量的选修科目。
下面的代码定义了一个percent()
函数,其中科学和数学的成绩存储在必填参数中,而可变数量的选修科目的成绩存储在**optional
参数中。
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