Python - 任意或可变长度参数



任意参数 (*args)

您可能希望定义一个能够接受任意或可变数量的参数的函数。此外,任意数量的参数可能是 位置参数关键字参数

  • 一个以单个星号 * 为前缀的参数,用于任意位置参数。
  • 一个以两个星号 ** 为前缀的参数,用于任意关键字参数。

任意参数示例

下面给出的是任意或可变长度位置参数的示例 -


# 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 变成了一个 Tuples。我们可以对其项目运行一个循环以添加数字。

它将产生以下输出 -

100
6

具有任意参数的必需参数

也可以在可变数量的值序列之前有一个带有一些必需参数的函数。

以下示例具有 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() 函数首先将第一个值传递给所需的参数,然后将其余值传递给名为 rest 的元组。然后我们找到最大值并使用它来计算平均值。

它将产生以下输出 -

45.0

任意关键字参数 (**kwargs)

如果参数列表中的变量前面有两个星号,则该函数可以接受任意数量的关键字参数。该变量将成为 keyword:value 对的字典

以下代码是具有任意关键字参数的函数示例。addr() 函数有一个参数 **kwargs,它能够接受任意数量的地址元素,如 name、city、phno、pin 等。在函数 kwargs 中,使用 items() 方法遍历 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

具有任意关键字参数的多个参数

如果函数使用混合类型的参数,则任意关键字参数应在参数列表中的 positional、keyword 和arbitrary positional arguments之后。

想象一下这样一种情况,科学和数学是必修科目,除此之外,学生还可以选择任意数量的选修科目。

以下代码定义了一个 percent() 函数,其中 science 中的 marks 和 marks 存储在 required 参数中,可变数量的选修科目中的 marks 存储在 **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