Funktionsparameter#

Quellen:

# Wir haben "im Kopf" die Reihenfolge Gewicht, Größe:
    
Adam_kg = 80
Adam_meter = 1.75 

Eva_kg = 60
Eva_meter = 1.65

Positionsparameter#

def bmi_1(groesse, gewicht): # Reihenfolge der Parameter hier: Größe, Gewicht
    """BMI: Gewicht durch quadrierte Körpergröße"""
    return round(gewicht / groesse ** 2, 1)

Wenn die Parameter in falscher Reihenfolge angegeben werden, entsteht Unsinn:

bmi_1(Adam_kg, Adam_meter)
0.0

So ist es richtig:

bmi_1(Adam_meter, Adam_kg), bmi_1(Eva_meter, Eva_kg)
(26.1, 22.0)

Benannte Parameter#

def bmi_2(*, groesse, gewicht):
    return round(gewicht / groesse ** 2, 1)

Reihenfolgen-Fehler treten jetzt nicht mehr auf:

bmi_2(gewicht=Adam_kg, groesse=Adam_meter)
26.1

Parameter aus einem Dict#

Annahme: Wir halten die Daten zu einer Person in einer Datenstruktur zusammen, z.B. in einem Dict:

Adam_Daten = {"gewicht": 80, "groesse": 1.75} # auch hier wieder Reihenfolge gewicht - größe

Übergebe nun die Daten aus dem Dict an die entsprechenden Parameter:

bmi_2(gewicht = Adam_Daten['gewicht'], groesse = Adam_Daten['groesse'])
26.1

Viel Schreibarbeit, hässlicher Code. Geht das auch einfacher?

Ziemlich Cool: Man kann an Stelle einzelner Funktionsparameter auch ein Dict auspacken und übergeben. Dabei werden die Keys des Dicts sinnvoll auf die Parameter gemappt.

bmi_2(**Adam_Daten)
26.1

Das funktioniert sogar auch bei Positions-Parameter (denn auch die haben ja einen Namen):

bmi_1(**Adam_Daten)
26.1

Parameter als Liste oder Dict erhalten#

Mit der folgenden Syntax werden alle “übriggebliebenen” Positionsparameter in einem Tupel und alle benannten Parameter in einem Dict übergeben:

def abc(a, *asterix, x, **obelix):
    print(f"{a=}")
    print(f"{asterix=}")
    print(f"{x=}")
    print(f"{obelix=}")
abc(1, 2, 3, x=4, y=5, z=6)
a=1
asterix=(2, 3)
x=4
obelix={'y': 5, 'z': 6}