python
def bestelle(artikel, menge=1, *, rabatt=0.0):
summe = menge * 10 * (1 - rabatt)
return f'{menge}x {artikel}: {summe:.2f}'
bestelle('Stift') # 1x Stift: 10.00
bestelle('Stift', 5) # 5x Stift: 50.00
bestelle('Stift', menge=5) # Schlüsselwort-Aufruf
bestelle(menge=5, artikel='Stift') # Reihenfolge egal bei Schlüsselwörtern
bestelle('Stift', 5, rabatt=0.1) # 5x Stift: 45.00
| Art | Schreibweise in der Definition | Aufruf | Bedeutung |
|---|---|---|---|
| Positional | def f(a, b) |
f(1, 2) |
Reihenfolge entscheidet |
| Schlüsselwort | def f(a, b) |
f(b=2, a=1) |
Name entscheidet, Reihenfolge egal |
| Standardwert | def f(a, b=10) |
f(1) |
Fehlender Parameter bekommt den Standardwert. Parameter mit Standardwert müssen nach denen ohne stehen |
| Nur Schlüsselwort | def f(a, *, b) |
f(1, b=2) |
Alles nach dem * muss mit Namen übergeben werden |
| Nur positional | def f(a, /, b) |
f(1, b=2) |
Alles vor dem / darf nicht mit Namen übergeben werden |
| Beliebig viele positional | def f(*args) |
f(1, 2, 3) |
args ist ein Tupel (1, 2, 3) |
| Beliebig viele Schlüsselwörter | def f(**kwargs) |
f(a=1, b=2) |
kwargs ist ein Dictionary {'a': 1, 'b': 2} |
python
def summe(*zahlen):
return sum(zahlen)
summe(1, 2, 3) # 6
werte = [4, 5, 6]
summe(*werte) # 15: * entpackt die Liste in einzelne Argumente
def verbinde(**optionen):
return optionen
config = {'host': 'localhost', 'port': 5432}
verbinde(**config) # ** entpackt das Dictionary in Schlüsselwörter
Das ist wichtig, weil Bibliotheken (z. B. psycopg.connect(host=..., port=...)) genau so aufgerufen werden.
Die größte Falle: veränderliche Standardwerte.
python
def falsch(x, liste=[]): # die Liste wird nur EINMAL beim Definieren erzeugt
liste.append(x)
return liste
falsch(1) # [1]
falsch(2) # [1, 2] Überraschung!
def richtig(x, liste=None):
if liste is None:
liste = []
liste.append(x)
return liste