如何在Python中的一个函数调用中使用默认值和任意参数?
我正在学习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')
在第一个函数调用,我想用默认值“大小”参数,这是“15”和“*浇头”武断的说法。
但是,我想不出如何做到这一点。
任何人都可以告诉我什么时候调用带多个参数的函数,我如何在一个函数调用中使用参数的默认值和任意参数?
提前,如果你觉得我的英语不舒服对不起
混音参数使用和不使用默认值的确可以混乱。 参数是函数定义中使用的名称,参数是传递给调用的值。
当调用,Python将始终从位置参数填写的所有参数,包括默认值名。 size
只是另一个参数,尽管它有一个默认值。您还可以在调用中使用name=value
语法将参数值分配给特定参数(不管它们是否具有默认值)。但是你不能告诉Python不要指定size
而不是你当前的函数定义,因为*toppings
参数之前的所有内容都是总是将成为常规位置参数。
*toppings
参数将只捕获任何位置参数所有其他参数已收到值后。所以'onion'
分配给size
,其余分配给*toppings
。
在Python 3,你可以让size
一个关键字唯一参数,通过把它们作为后的*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)
def make_pizza(toppings,size=15):
"""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(toppings = ['onion','shrimp','goda cheese','mushroom'])
make_pizza(size = 17,toppings = ['onion','shrimp','goda cheese','mushroom'])
有你的方法的一个基本问题(我不是本地人。):因为你怎么知道,如果你打算作为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)
你也可以保持配料为arbitary位置参数,使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',没有必要到m说一个单一的论点。 –
@MartijnPieters对,我只是觉得他想把size当作位置参数。使用'* toppings'会产生一个尾随的'size = 15'关键字(仅限于python-3)。 – MSeifert
谢谢!现在我明白了什么是问题。 – Yeni