我正在学习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”任意参数。
但是,我无法弄清楚如何做到这一点。
当我调用具有多个参数的函数时,有人能告诉我,如何在一个函数调用中使用参数的默认值和任意参数?
如果您对我的英语感到不舒服,请提前抱歉(我不是当地人。)
答案 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
的序列,它会更改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)