如何在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) 
+0

谢谢!现在我明白了什么是问题。 – Yeni

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,它改变了toppingssize顺序,但它可能是一个很大清洁器。

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) 
+0

您仍然可以保持'* toppings',没有必要到m说一个单一的论点。 –

+0

@MartijnPieters对,我只是觉得他想把size当作位置参数。使用'* toppings'会产生一个尾随的'size = 15'关键字(仅限于python-3)。 – MSeifert