1. Die Fabrik-Analogie: Was ist eine Funktion?
Eine Funktion ist wie eine kleine, eigenständige Fabrikmaschine (oder ein Zauberkasten). Du gibst ihr Zutaten hinein, die Maschine verarbeitet sie, und am Ende liefert sie ein fertiges Produkt heraus!
- Input (Parameter): Die Zutaten, die du beim Aufruf übergibst (z.B. zwei Zahlen:
a = 3,b = 4). - Verarbeitung: Die Rechenschritte im Inneren der Funktion (z.B. Satz des Pythagoras
c = math.sqrt(a**2 + b**2)). - Output (
return): Das fertige Produkt, das an dein Hauptprogramm zurückgegeben wird (z.B.5.0).
2. Der entscheidende Unterschied: return vs. print()
Das ist der häufigste Stolperstein für alle Programmieranfänger:
print(...)
Schreibt nur Text auf den Bildschirm. Das Programm kann mit der Bildschirmausgabe nicht weiterrechnen!
return ...
Übergibt den echten Wert zurück an den Aufrufer. Du kannst das Ergebnis in Variablen speichern und weiterverwenden!
# ❌ Falsch: Mit print() kann man nicht weiterrechnen def quadrat_falsch(x): print(x * x) ergebnis = quadrat_falsch(5) # Gibt 25 auf der Konsole aus, liefert aber None! # print(ergebnis + 10) # 💥 TypeError: unsupported operand type for +: 'NoneType' and 'int' # ✅ Richtig: Mit return kann der Wert weiterverwendet werden def quadrat_richtig(x): return x * x ergebnis = quadrat_richtig(5) # ergebnis ist jetzt der echte Wert 25! print(ergebnis + 10) # Funktioniert perfekt -> Ausgabe: 35
3. Standardwerte (Defaults) & Mehrere Rückgabewerte
Du kannst Parametern Standardwerte geben, die verwendet werden, wenn beim Aufruf kein Wert übergeben wird:
# Standardwert seiten=6 (W6 Spielwürfel) def wuerfeln(anzahl: int, seiten: int = 6) -> list[int]: ergebnisse = [] for _ in range(anzahl): ergebnisse.append(random.randint(1, seiten)) return ergebnisse print(wuerfeln(3)) # 3 normale 6-seitige Würfel print(wuerfeln(2, seiten=20)) # 2 20-seitige D20-Würfel
Mehrere Werte zurückgeben (Tuple-Unpacking):
Trenne Rückgabewerte einfach mit Kommas. Beim Aufruf kannst du sie direkt in separate Variablen entpacken:
def min_max_spanne(werte: list[float]) -> tuple[float, float]: return min(werte), max(werte) # Beide Werte auf einmal entpacken: tiefster, hoechster = min_max_spanne([12.5, 3.1, 18.9]) print(f"Minimum: {tiefster}, Maximum: {hoechster}")
4. Gültigkeitsbereich: Lokaler vs. Globaler Scope 🏠
globaler_name = "Alice" # Überall im gesamten Programm sichtbar def geheimnis(): lokales_passwort = "Geheim123" # Nur HIER DRINNEN sichtbar! print("In Funktion:", lokales_passwort) geheimnis() # print(lokales_passwort) # 💥 NameError: name 'lokales_passwort' is not defined!
5. Die Python-Werkzeugkiste: Module math & random
Python bringt hunderte nützliche Module mit. Du bindest sie mit import modulname am Anfang deiner Datei ein:
Modul math
math.sqrt(x): Quadratwurzel von x
math.pi: Kreiszahl π ≈ 3.14159...
math.pow(b, e): Potenzieren $b^e$
math.floor(x) / math.ceil(x): Ab-/Aufrunden
Modul random
random.randint(a, b): Zufalls-Ganzzahl von a bis b
random.random(): Zufalls-Float zwischen 0.0 und 1.0
random.choice(liste): Zufälliges Element wählen
random.shuffle(liste): Liste mischen
6. 🎯 Deine Aufgaben in aufgabe.py
Öffne die Datei aufgabe.py und bearbeite die folgenden 4 Aufgaben:
💡 Lösungshinweise (Aufklappen bei Bedarf)
🔍 Tipp zu TODO 1 & 2 (Geometrie mit math)
import math def hypotenuse(a: float, b: float) -> float: if a < 0 or b < 0: raise ValueError("Seitenlängen dürfen nicht negativ sein") return math.sqrt(a**2 + b**2)
🔍 Tipp zu TODO 3 (Würfelsimulator mit random)
import random def wuerfle_wuerfel(anzahl: int, seiten: int = 6) -> list[int]: if anzahl < 0 or seiten < 1: raise ValueError("Ungültige Würfel-Parameter") ergebnisse = [] for _ in range(anzahl): ergebnisse.append(random.randint(1, seiten)) return ergebnisse
🔍 Tipp zu TODO 4 (Statistik & Tupel-Return)
def statistik(zahlen: list[float]) -> tuple[float, float, float]: if not zahlen: raise ValueError("Die Liste darf nicht leer sein") return min(zahlen), max(zahlen), sum(zahlen) / len(zahlen)
7. 🧪 Testen & Weitergehen
Führe im Terminal den Unittest aus:
python3 test_aufgabe.py