如何在 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
传递一个序列,它会改变toppings
和size
的顺序,但它可能更简洁。
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 中的一个函数调用中使用默认值和任意参数?的主要内容,如果未能解决你的问题,请参考以下文章