在 Python 中使用可变参数

已完成

在 Python 中,可以使用任意数量的参数和关键字参数,而无需声明其中的每个参数。 当函数可能会收到未知数量的输入时,此功能很有用。

可变参数

函数中的参数是必需的。 但使用可变参数时,函数可允许传入任意数量的参数(包括 0 个参数)。 使用可变参数的语法是在参数名之前加上一个星号 (*)。

以下函数打印接收到的参数:

def variable_length(*args):
    print(args)

注意

不需要调用可变参数 args。 你可以使用任何有效的变量名。 虽然 *args*a 很常见,但应尝试在整个项目中使用相同的约定。

在本例中,*args 将指示函数接受任意数量的参数(包括 0 个参数)。 在函数中,args 现在可以作为变量,将所有参数作为元组保存。 通过传递任意数量或类型的参数来试运行函数:

variable_length()
()
variable_length("one", "two")
('one', 'two')
variable_length(None)
(None,)

如你所见,传入参数的数量或类型没有任何限制。

在发射之前,火箭飞船需要完成几个步骤。 根据任务或延迟情况,这些步骤所需的时间可能比计划时间长。 我们来创建一个长度可变的函数,已知每个步骤所需的时长,该函数可以计算距离发射的时间:

def sequence_time(*args):
    total_minutes = sum(args)
    if total_minutes < 60:
        return f"Total time to launch is {total_minutes} minutes"
    else:
        return f"Total time to launch is {total_minutes/60} hours"

通过传递任意分钟数来试运行函数:

sequence_time(4, 14, 18)
Total time to launch is 36 minutes.
sequence_time(4, 14, 48)
Total time to launch is 1.1 hours.

注意

使用可变参数时,不再为每个值分配变量名。 所有值现在都是使用星号的 catch-all 变量名的一部分(在这些示例中为 args)。

可变关键字参数

若要使函数接受任意数量的关键字参数,请使用类似的语法。 在本例中,需要使用双星号:

def variable_length(**kwargs):
    print(kwargs)

尝试执行示例函数,该函数将打印作为 kwargs 传入的名称和值:

variable_length(tanks=1, day="Wednesday", pilots=3)
{'tanks': 1, 'day': 'Wednesday', 'pilots': 3}

如果你已熟悉 Python 字典,你会注意到,长度可变的关键字参数是以字典形式分配的。 若要与变量和值交互,请使用与字典相同的操作。

注意

与可变参数一样,在使用可变关键字参数时,不需要使用 kwargs。 你可以使用任何有效的变量名。 虽然 **kwargs**kw 很常见,但应尝试在整个项目中使用相同的约定。

在此函数中,让我们使用可变关键字参数来报告分给该任务的宇航员。 由于此函数允许任意数量的关键字参数,因此可以重复使用该函数,而不考虑分配的宇航员人数:

def crew_members(**kwargs):
    print(f"{len(kwargs)} astronauts assigned for this mission:")
    for title, name in kwargs.items():
        print(f"{title}: {name}")

借助阿波罗 11 号的全体组员试运行此函数:

crew_members(captain="Neil Armstrong", pilot="Buzz Aldrin", command_pilot="Michael Collins")
3 astronauts assigned for this mission:
captain: Neil Armstrong
pilot: Buzz Aldrin
command_pilot: Michael Collins

由于可以传递关键字参数的任意组合,因此请确保避免使用重复关键字。 重复关键字将导致错误:

crew_members(captain="Neil Armstrong", pilot="Buzz Aldrin", pilot="Michael Collins")
  File "<stdin>", line 1
SyntaxError: keyword argument repeated: pilot