Python bietet sehr flexible Möglichkeiten, Argumente zu übergeben: Standardwerte, Namen, beliebig viele Werte und mehr.
Standardwerte
Ein Parameter mit = hat einen Standardwert und darf beim Aufruf weggelassen werden:
def begruesse(name, gruss="Hallo"):
return f"{gruss}, {name}!"
print(begruesse("Mia"))
print(begruesse("Tom", "Guten Morgen"))Hallo, Mia! Guten Morgen, Tom!
Parameter mit Standardwert stehen immer hinter denen ohne.
Benannte Argumente (Keyword-Argumente)
Beim Aufruf kannst du Argumente beim Namen nennen. Dann ist die Reihenfolge egal, und der Aufruf wird lesbarer:
def rechteck(laenge, breite, einheit="cm"):
return f"{laenge} x {breite} {einheit}"
print(rechteck(3, 4))
print(rechteck(breite=2, laenge=9))
print(rechteck(5, 6, einheit="m"))3 x 4 cm 9 x 2 cm 5 x 6 m
Beliebig viele Argumente: *args
Mit *args sammelt eine Funktion alle zusätzlichen Argumente in einem Tupel:
def summe(*zahlen):
print(zahlen)
return sum(zahlen)
print(summe(1, 2, 3))
print(summe(10, 20))
print(summe())(1, 2, 3) 6 (10, 20) 30 () 0
Beliebige benannte Argumente: **kwargs
Mit **kwargs landen zusätzliche benannte Argumente in einem Dictionary:
def profil(name, **angaben):
print(name, angaben)
profil("Mia", alter=17, stadt="Köln")
profil("Tom")Mia {'alter': 17, 'stadt': 'Köln'}
Tom {}Listen und Dictionaries "auspacken"
Beim Aufruf entpackt * eine Liste in einzelne Argumente und ** ein Dictionary in benannte Argumente:
def addiere(a, b, c):
return a + b + c
werte = [1, 2, 3]
print(addiere(*werte))
namen = {"a": 10, "b": 20, "c": 30}
print(addiere(**namen))6 60
Nur-Positions- und Nur-Schlüsselwort-Parameter
Ein * in der Parameterliste erzwingt, dass alles dahinter benannt übergeben wird. Ein / legt fest, dass alles davor positional übergeben werden muss:
def kreis(*, radius, farbe="blau"):
return f"Kreis r={radius}, {farbe}"
print(kreis(radius=3))Kreis r=3, blau
kreis(3)Traceback (most recent call last):
File "beispiel.py", line 1, in <module>
kreis(3)
TypeError: kreis() takes 0 positional arguments but 1 was givenReihenfolge der Parameter
Die vollständige Reihenfolge in einer Definition lautet: normale Parameter, Parameter mit Standardwert, *args, nur benannte Parameter, **kwargs.
def alles(a, b=2, *args, c=3, **kwargs):
return a, b, args, c, kwargs
print(alles(1))
print(alles(1, 20, 30, 40, c=50, x=60))(1, 2, (), 3, {})
(1, 20, (30, 40), 50, {'x': 60})Argumente sind Verweise
Übergibst du ein veränderliches Objekt, kann die Funktion es verändern. Bei unveränderlichen Werten geht das nicht:
def fuege_hinzu(liste):
liste.append("neu")
meine_liste = ["alt"]
fuege_hinzu(meine_liste)
print(meine_liste)['alt', 'neu']
Merke
- Standardwerte:
def f(a, b=10), Parameter mit Standardwert nach hinten - Benannte Argumente:
f(b=2, a=1) *argssammelt zusätzliche Positionsargumente (Tupel),**kwargsbenannte (Dictionary)- Beim Aufruf entpacken
*listeund**dict *in der Definition erzwingt benannte Argumente- Veränderliche Argumente kann die Funktion ändern
Aufgabe
Schreibe durchschnitt(*zahlen), die den Durchschnitt beliebig vieler Zahlen berechnet, und teste sie mit drei und mit fünf Werten.