python
def ist_primzahl(n):
if n < 2:
return False
for teiler in range(2, int(n ** 0.5) + 1):
if n % teiler == 0:
return False
return True
def statistik(zahlen, *, runden=2):
if not zahlen:
return None
return {
'min': min(zahlen),
'max': max(zahlen),
'mittel': round(sum(zahlen) / len(zahlen), runden),
}
def filtere(kunden, **bedingungen):
ergebnis = []
for kunde in kunden:
passt = all(kunde.get(feld) == wert for feld, wert in bedingungen.items())
if passt:
ergebnis.append(kunde)
return ergebnis
kunden = [
{'name': 'Anna', 'stadt': 'Wien', 'aktiv': True},
{'name': 'Ben', 'stadt': 'Graz', 'aktiv': True},
{'name': 'Cem', 'stadt': 'Wien', 'aktiv': False},
]
print([k for k in range(20) if ist_primzahl(k)]) # [2, 3, 5, 7, 11, 13, 17, 19]
print(statistik([4, 9, 2])) # {'min': 2, 'max': 9, 'mittel': 5.0}
print(filtere(kunden, stadt='Wien', aktiv=True)) # nur Anna
Was passiert:
ist_primzahl: Es genügt, Teiler bis zur Wurzel vonnzu prüfen.n ** 0.5ist die Wurzel,int(...) + 1macht daraus die Obergrenze fürrange. Das frühereturn Falsebeendet die Funktion sofort, sobald ein Teiler gefunden ist.statistik:if not zahlenist wahr bei einer leeren Liste (Kapitel 2, Wahrheitswerte). Das*vorrundenerzwingt, dass manrunden=3mit Namen schreibt. Das macht Aufrufe lesbarer.filtere:**bedingungensammeltstadt='Wien', aktiv=Truezu einem Dictionary.all(...)prüft, ob jede Bedingung erfüllt ist.kunde.get(feld)liefertNonestatt eines Fehlers, wenn das Feld fehlt.
Warum so: Kleine Funktionen mit einer klaren Aufgabe sind leicht zu testen und wiederzuverwenden. Die Funktion filtere zeigt, wie **kwargs flexible Schnittstellen ermöglichen, genau wie du sie später bei Datenbank- und API-Bibliotheken siehst.