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

Posted

技术标签:

【中文标题】如何在 Python 中的一个函数调用中使用默认值和任意参数?【英文标题】:How to use default values and arbitrary arguments at one function call in Python? 【发布时间】:2018-03-08 21:18:24 【问题描述】:

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

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

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

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

【问题讨论】:

【参考方案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)

【讨论】:

你仍然可以保留*toppings,没有必要让它成为一个单独的参数。 @MartijnPieters 对,我只是认为他想要 size 作为位置参数。使用 *toppings 将使尾随 size=15 仅关键字(且仅 python-3)。【参考方案2】:

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

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

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

【讨论】:

谢谢!!现在我明白问题出在哪里了。

以上是关于如何在 Python 中的一个函数调用中使用默认值和任意参数?的主要内容,如果未能解决你的问题,请参考以下文章

Python,调用一个带参数默认值的函数

delphi如何调用多个参数的函数

python 函数中怎么实现static 变量

Python 3:更改现有函数参数的默认值?

Python函数-3

Python 函数