Python - 可变长度参数
任意参数 (*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 成为一个 tuple。我们可以遍历它的元素来对数字求和。
它将产生以下输出 −
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 的 tuple。然后我们找到最大值并用它来计算平均值。
它将产生以下输出 −
45.0
任意关键字参数 (**kwargs)
如果参数列表中的变量前面有两個星号 ** 前缀,则该函数可以接受任意数量的关键字参数。该变量成为关键字:值对的 dictionary。
示例
以下代码是一个带有任意关键字参数的函数示例。addr() 函数有一个参数 **kwargs,它能够接受任意数量的地址元素,如 name、city、phno、pin 等。在函数内部,使用 items() 方法遍历 kwargs dictionary 中的 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
多个参数与任意关键字参数
如果函数使用混合类型的参数,则任意关键字参数应该位于参数列表中的位置参数、关键字参数和任意位置参数之后。
示例
想象一种情况,其中科学和数学是必修科目,此外学生可以选择任意数量的选修科目。
以下代码定义了一个 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