如何在 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
传递一个序列,它会更改 toppings
和 size
的顺序,但它可能更清晰。
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)
我正在学习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
传递一个序列,它会更改 toppings
和 size
的顺序,但它可能更清晰。
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)