Direkt zum Hauptinhalt springen
eLearner.app
Modul 5 · Lektion 2 von 418/36 im Kurs~12 min
Lektionen des Moduls (2/4)

Standardparameter und Keyword-Argumente

Funktionsparameter können Standardwerte haben: Wenn der Aufrufer sie nicht übergibt, werden die Standardwerte verwendet. Du kannst eine Funktion auch aufrufen, indem du Parameter namentlich übergibst (Schlüsselwortargumente oder keyword arguments).

Standardparameter

Python
def saluta(nome, saluto="Ciao"):
    return f"{saluto}, {nome}!"

saluta("Ada")              # 'Ciao, Ada!'
saluta("Ada", "Hello")     # 'Hello, Ada!'

Parameter mit Standardwerten müssen nach den Parametern ohne Standardwerte stehen:

Python
def f(a, b=1):     # OK
def f(a=1, b):     # SyntaxError

Schlüsselwortargumente

Du kannst Argumente namentlich und in beliebiger Reihenfolge übergeben, was den Aufruf lesbarer macht:

Python
def crea_utente(nome, eta, attivo=True):
    return {"nome": nome, "eta": eta, "attivo": attivo}

crea_utente("Ada", 36)
crea_utente(nome="Ada", eta=36, attivo=False)
crea_utente(eta=36, nome="Ada")     # any order when all are keyword

Goldene Regel: In einem Aufruf stehen positionelle Argumente VOR Schlüsselwortargumenten.

Python
crea_utente("Ada", eta=36)            # OK
crea_utente(nome="Ada", 36)           # SyntaxError

⚠️ Die Falle mit veränderlichen Standardwerten (mutable default)

Verwende NIEMALS ein veränderliches Objekt (Liste, Dictionary, Set) als Standardwert: Der Standardwert wird NUR EINMAL ausgewertet (wenn die Funktion definiert wird) und von allen Aufrufen gemeinsam genutzt.

Python
def aggiungi(elemento, lista=[]):   # BUG!
    lista.append(elemento)
    return lista

aggiungi(1)    # [1]
aggiungi(2)    # [1, 2]    !!! not [2] as you'd expect
aggiungi(3)    # [1, 2, 3]

Das richtige Muster: Verwende None als Wächter und erstelle das Objekt intern:

Python
def aggiungi(elemento, lista=None):
    if lista is None:
        lista = []
    lista.append(elemento)
    return lista

Die Gefahr von veränderlichen Standardargumenten

Verwende niemals veränderliche Objekte (wie Listen oder Dictionaries) als Standardwerte für Parameter: zum Beispiel def add(x, my_list=[]). Der Standardwert wird nur einmal bei der Definition der Funktion ausgewertet, was bedeutet, dass nachfolgende Aufrufe genau dasselbe veränderliche Objekt teilen! Die beste Praxis ist die Verwendung von None:

Python
def add(x, my_list=None):
    if my_list is None:
        my_list = []
    my_list.append(x)
    return my_list

Probiere es aus

Übung#python.m5.l2.e1
Versuche: 0Wird geladen…

Definiere `power(base, exponent=2)`, das base ** exponent zurückgibt. Berechne `square = power(5)` und `cube = power(5, exponent=3)`. Evaluiere `(square, cube)`.

Editor wird geladen…
Hinweis anzeigen

return base ** exponent

Lösung nach 3 Versuchen verfügbar

Wiederholungsübung

Übung#python.m5.l2.e2
Versuche: 0Wird geladen…

Definiere `create_record(name, values=None)`, das eine neue leere Liste verwendet, wenn values gleich None ist. Füge 1 zu values hinzu und gib das Record-Dictionary {'name': name, 'values': values} zurück. Rufe es zweimal auf, ohne values zu übergeben, und weise die Ergebnisse `a` und `b` zu. Evaluiere `(a['values'], b['values'])`.

Editor wird geladen…
Hinweis anzeigen

Verwende None als Standardwert und erstelle die Liste innerhalb der Funktion.

Lösung nach 3 Versuchen verfügbar

Zusätzliche Herausforderung

Übung#python.m5.l2.e3
Versuche: 0Wird geladen…

Definiere eine Funktion `greet(name, message="Hello")` die den formatierten String `"{message}, {name}!"` zurückgibt. Teste die Funktion, indem du `greet("Bob")` als letzten Ausdruck aufrufst.

Editor wird geladen…
Hinweis anzeigen

Verwende einen Standardparameter message="Hello" und einen f-String für die zurückgegebene Begrüßung.

Lösung nach 3 Versuchen verfügbar