Funktionsparameter
Contents
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}