Python 简明教程

Python - Arbitrary or, Variable-length Arguments

Arbitrary Arguments (*args)

您可能希望定义能够接受 arbitraryvariable number of argumentsfunction 。此外,任意数量的参数可能为 positionalkeyword arguments

You may want to define a function that is able to accept arbitrary or variable number of arguments. Moreover, the arbitrary number of arguments might be positional or keyword arguments.

  1. An argument prefixed with a single asterisk * for arbitrary positional arguments.

  2. An argument prefixed with two asterisks ** for arbitrary keyword arguments.

Arbitrary Arguments Example

以下是任意或可变长度位置参数的示例 −

Given below is an example of arbitrary or variable length positional arguments −

# 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 变成了一个元组。我们可以对它的项目运行一个 loop 以添加数字。

The args variable prefixed with "*" stores all the values passed to it. Here, args becomes a tuple. We can run a loop over its items to add the numbers.

它将生成以下 output

It will produce the following output

100
6

Required Arguments With Arbitrary Arguments

variable 个值序列之前也可能具有带有某些必需参数的函数。

It is also possible to have a function with some required arguments before the sequence of variable number of values.

Example

以下示例有 avg() 函数。假设一个学生可以参加任意数量的测试。第一个测试是强制性的。他可以参加任意数量的测试来提高他的分数。该函数计算第一个测试中的分数平均值和其余测试中的最高分。

The following example has avg() function. Assume that a student can take any number of tests. First test is mandatory. He can take as many tests as he likes to better his score. The function calculates the average of marks in first test and his maximum score in the rest of tests.

该函数有两个参数,第一个是必需的参数,第二个是用来保存任意数量的值。

The function has two arguments, first is the required argument and second to hold any number of values.

#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 的元组。然后我们找到最大值并使用它来计算平均值。

Following call to avg() function passes first value to the required argument first, and the remaining values to a tuple named rest. We then find the maximum and use it to calculate the average.

它将生成以下 output

It will produce the following output

45.0

Arbitrary Keyword Arguments (**kwargs)

如果参数列表中的变量前缀有两个星号,则函数可以接受任意数量的关键字参数。变量成为关键字:值的 dictionary 对。

If a variable in the argument list has two asterisks prefixed to it, the function can accept arbitrary number of keyword arguments. The variable becomes a dictionary of keyword:value pairs.

Example

下面的代码是带任意关键字参数的函数示例。addr() 函数有一个参数 **kwargs,能够接受任意数量的地址元素,如名称、城市、电话号码、邮政编码等。在函数内部,kwargs 关键字:值对的字典使用 items() 方法进行遍历。

The following code is an example of a function with arbitrary keyword arguments. The addr() function has an argument **kwargs which is able to accept any number of address elements like name, city, phno, pin, etc. Inside the function kwargs dictionary of kw:value pairs is traversed using items() method.

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")

它将生成以下 output

It will produce the following output

pass two keyword args
Name:John
City:Mumbai
pass four keyword args
Name:Raam
City:Mumbai
ph_no:9123134567
PIN:400001

Multiple Arguments With Arbitrary Keyword Arguments

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

If the function uses mixed types of arguments, the arbitrary keyword arguments should be after positional, keyword and arbitrary positional arguments in the argument list.

Example

试想一下,科学和数学是必修科目,除此之外,学生可以选择任意数量的选修课。

Imagine a case where science and maths are mandatory subjects, in addition to which student may choose any number of elective subjects.

以下代码定义一个 percent() 函数,其中科学中的分数和数学中的分数存储在必需参数中,而可变数量的选修科目中的分数存储在 **optional 参数中。

The following code defines a percent() function where marks in science and marks are stored in required arguments, and the marks in variable number of elective subjects in **optional argument.

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)

它将生成以下 output

It will produce the following output

maths: 80
sci: 75
Eng:70
Hist:65
Geo:72
percentage: 72.4