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

时间:2017-09-27 11:40:49

标签: python function arguments default-value

我正在学习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”任意参数。

但是,我无法弄清楚如何做到这一点。

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

如果您对我的英语感到不舒服,请提前抱歉(我不是当地人。)

2 个答案:

答案 0 :(得分:6)

使用和不使用默认值混合参数确实会让人感到困惑。 参数是函数定义中使用的名称, arguments 是传递给调用的值。

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

{/ 1}}参数只会在所有其他参数都已接收到值后捕获任何位置参数。因此,*toppings被分配到'onion',其余的被分配到size

在Python 3中,您可以将*toppings设为仅关键字参数,方法是将size 置于 {{1}之后}名称或空name=default

*toppings

现在*只能通过def make_pizza(*toppings, size=15): 关键字参数语法调用来设置。

在Python 2中,您只能使用size catch-all参数捕获此类关键字参数,之后您需要查看size=<new value>的字典:

**kwargs

在这两种情况下,你必须记住明确地命名size,并在位置参数之后放置明确命名的关键字参数

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

答案 1 :(得分:1)

您的方法存在一个根本问题:它含糊不清,因为您如何知道自己是将其视为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):

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)