如何在 Python 中的一个函数调用中使用默认值和任意参数?

How to use default values and arbitrary arguments at one function call in Python?

我正在学习Python。

我了解了默认值和任意参数。

因此,我创建了一个函数,其中一个参数提供默认值,另一个参数具有任意数量的参数。

def make_pizza(size=15,*toppings):
    """Summerize the pizza that we are about to make."""
    print("\nMaking a " + str(size) + 
    "-inch pizza with the following toppings: ")
    for topping in toppings:
        print("- " + topping)


make_pizza('onion','shrimp','goda cheese','mushroom' )
make_pizza(17,'ham','extra meat','sweet con','pepperoni')

在第一次函数调用时,我想使用 "size" 参数的默认值“15”和“*toppings”任意参数。

但是,我不知道该怎么做。

谁能告诉我当我调用一个带有多个参数的函数时,如何在一个函数调用中使用参数的默认值和任意参数?

如果您对我的英语感到不满意(我不是母语。)提前抱歉

您的方法存在一个根本问题:它模棱两可,因为您如何知道您打算将其作为 size 还是 topping? Python 做不到,所以你需要找到一个替代方案。

好吧,您可以简单地从参数列表中删除 size 并将第一个 *toppings 参数解释为整数(如果它是整数):

def make_pizza(*toppings):
    if toppings and isinstance(toppings[0], int):
        size, toppings = toppings[0], toppings[1:]
    else:
        size = 15
    print("\nMaking a {}-inch pizza with the following toppings: ".format(size))
    for topping in toppings:
        print("- " + topping)

然而,对于无法进行简单类型检查的情况,这将失败。也许更好的方法是使 toppings 成为普通参数,而 size 成为可选参数:

def make_pizza(toppings, size=15):
    print("\nMaking a {}-inch pizza with the following toppings: ".format(size))
    for topping in toppings:
        print("- " + topping)

然而,您需要为 toppings 传递一个序列,它会更改 toppingssize 的顺序,但它可能更清晰。

make_pizza(['onion','shrimp','goda cheese','mushroom'])
make_pizza(['ham','extra meat','sweet con','pepperoni'], 17)

您还可以将浇头保留为任意位置参数,并使 size 成为默认的仅关键字参数(Python3-only):

def make_pizza(*toppings, size=15):
    print("\nMaking a {}-inch pizza with the following toppings: ".format(size))
    for topping in toppings:
        print("- " + topping)

make_pizza('onion','shrimp','goda cheese','mushroom')
make_pizza('ham','extra meat','sweet con','pepperoni', size=17)

混合使用带默认值和不带默认值的参数确实会造成混淆。 参数是函数定义中使用的名称,参数是传递给调用的值。

调用时,Python将始终填充位置参数中的所有参数,包括具有默认值的名称size 这里只是另一个参数,尽管它有一个默认值。您还可以在调用中使用 name=value 语法将参数值分配给特定参数(无论它们是否具有默认值)。但是你不能告诉 Python 不要给 size 赋值,不能用你当前的函数定义,因为 *toppings 参数之前的所有内容都是 always 将成为常规位置参数。

*toppings 参数将仅捕获任何位置参数 所有其他参数都接收到值之后。所以'onion'赋给size,余数赋给*toppings.

在 Python 3 中,您可以将 size 设为 仅关键字参数 ,方法是将它们放置为 name=default *toppings 名称之后,或者一个空的 *:

def make_pizza(*toppings, size=15):

现在 size 只能通过使用 size=<new value> 关键字参数语法的调用来设置。

在 Python 2 中,您只能使用 **kwargs 包罗万象的参数来捕获此类关键字参数,之后您需要查看字典中的 size:

def make_pizza(*toppings, **kwargs):
    size = kwargs.get('size', 15)  # set a default if missing

在这两种情况下,您都必须记住显式命名 size,并将此类显式命名的关键字参数 放在位置参数 之后:

make_pizza('ham', 'extra meat', 'sweet con', 'pepperoni', size=17)