Grundlagen G06 • Schulabgleich 05.0 & 05.1

Eigene Funktionen & Module 🪄📦

Lerne, wie du saubere Funktionen baust, Ergebnisse mit return zurückgibst, Variablen-Scopes verstehst und Standard-Module wie math und random nutzt.

📂 Dateien dieser Einheit:
💻 In Web-IDE öffnen → 📄 aufgabe.py (Startercode) 🧪 test_aufgabe.py (Tests) 💡 musterloesung.py (Lösung) 📖 README.md

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!

🏭 Das 3-Schritte-Prinzip jeder Funktion:
  1. Input (Parameter): Die Zutaten, die du beim Aufruf übergibst (z.B. zwei Zahlen: a = 3, b = 4).
  2. Verarbeitung: Die Rechenschritte im Inneren der Funktion (z.B. Satz des Pythagoras c = math.sqrt(a**2 + b**2)).
  3. 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!

Vergleich: print() vs. return
# ❌ 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:

Python (Standardwerte und Tupel-Return)
# 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:

Python (Mehrere Rückgabewerte)
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 🏠

🏨 Die Hotelzimmer-Regel:
Variablen, die innerhalb einer Funktion erstellt werden (z.B. Zwischenergebnisse oder Zähler), sind lokal. Sie existieren nur für die Dauer des Funktionsaufrufs und sind von außen unsichtbar und unzugänglich.
Scope-Veranschaulichung
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:

Terminal
python3 test_aufgabe.py