2017-09-27 1 views
0

Ich lerne Python.Wie Verwenden von Standardwerten und beliebigen Argumenten bei einem Funktionsaufruf in Python?

Ich lernte über den Standardwert und willkürliche Argumente.

Also habe ich meine Funktion, die einen Parameter bietet einen Standardwert und einen anderen Parameter mit einer beliebigen Anzahl von Argumenten.

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') 

Beim ersten Funktionsaufruf, wollte ich den Standardwert für den Parameter „size“ verwenden, die „15“ und das „* Toppings“ willkürlichen Argument ist.

Aber ich konnte nicht herausfinden, wie das geht.

Könnte mir jemand sagen, wenn ich eine Funktion mit mehreren Argumenten aufrufen, wie kann ich Parameter Standardwerte und willkürliche Argumente bei einem Funktionsaufruf verwenden?

Leider im Voraus, wenn Sie mit meinem Englisch unwohl fühlen

Antwort

2

Mixing-Parameter mit und ohne Standardwerte können in der Tat sein verwirrend. Parameter sind die in der Funktionsdefinition verwendeten Namen Argumente sind die in einen Aufruf übergebenen Werte.

Wenn Aufruf, Python werden immer alle Parameter aus Positionsargumente füllen, einschließlich Namen mit Standardwerten. size ist nur ein weiterer Parameter hier, obwohl es einen Standardwert hat. Sie können auch die Syntax name=value in einem Aufruf verwenden, um einem bestimmten Parameter einen Argumentwert zuzuweisen (unabhängig davon, ob sie einen Standardwert haben oder nicht).Aber Sie können Python nicht sagen, dass Sie size nicht etwas zuweisen sollen, nicht mit Ihrer aktuellen Funktionsdefinition, denn alles vor dem *toppings Parameter ist immer wird ein regulärer Positionsparameter sein.

Der Parameter *toppings erfasst nur Positionsargumente , nachdem alle anderen Parameter Werte erhalten haben. So wird 'onion'size zugewiesen, und der Rest wird *toppings zugewiesen.

In Python 3 können Sie size machen ein Stichwort Geschützter Parameter, indem man sie als name=defaultnach der *toppings Namen platzieren oder einen leeren *:

def make_pizza(*toppings, size=15): 

Jetzt können size nur eingestellt werden, von einem Anruf mit size=<new value> Schlüsselwortargumentsyntax.

In Python 2, Sie können nur solche Schlüsselwort Argumente mit einem **kwargs catch-all-Parameter erfassen, nach denen Sie für Ihre size in diesem Wörterbuch suchen müssen:

def make_pizza(*toppings, **kwargs): 
    size = kwargs.get('size', 15) # set a default if missing 

In beiden Fällen müssen Sie erinnern ausdrücklich size zu nennen, und setzen so explizit genannt Schlüsselwort Argumente nach die Positionsargumente:

make_pizza('ham', 'extra meat', 'sweet con', 'pepperoni', size=17) 
+0

Danke !! Jetzt verstehe ich, was das Problem war. – Yeni

-1
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']) 
0

Es gibt ein grundlegendes Problem mit dem Ansatz (ich bin kein nativer.): Es ist nicht eindeutig, denn wie Sie wissen, wenn Sie es als size bestimmt oder als topping? Python kann das nicht, also müssen Sie eine Alternative finden.

Nun könnte man einfach size aus der Argumentliste entfernen und die erste *toppings Argument als Größe interpretieren, wenn es eine ganze Zahl ist:

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) 

jedoch, dass für den Fall fehlschlagen wird, wo eine einfache Typprüfung nicht möglich ist, . Vielleicht wäre der bessere Ansatz toppings ein normales Argument und size ein optionales Argument zu machen:

def make_pizza(toppings, size=15): 
    print("\nMaking a {}-inch pizza with the following toppings: ".format(size)) 
    for topping in toppings: 
     print("- " + topping) 

aber dann müssen Sie für toppings in einer Sequenz passieren und es ändert sich die Reihenfolge der toppings und size aber es ist wahrscheinlich viel Reiniger.

make_pizza(['onion','shrimp','goda cheese','mushroom']) 
make_pizza(['ham','extra meat','sweet con','pepperoni'], 17) 

Sie könnten auch den Belag als Arbitary Positionsargumente halten und size ein Schlüsselwort Geschützter Parameter mit Standard (Python3-only) machen:

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

Sie können immer noch halten '* toppings', gibt es keine Notwendigkeit, m ake es ein einziges Argument. –

+0

@MartijnPieters Richtig, ich dachte nur, er wollte 'Größe' als Positionsargument. Die Verwendung von '* toppings' führt zu einem nachgestellten 'size = 15'-Schlüsselwort (nur Python-3). – MSeifert

Verwandte Themen