it-praxisportal/lehrpfad_1_grundlagen/06_funktionen_und_module/index.html

482 lines
28 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Kapitel G06: Eigene Funktionen & Module</title>
<link rel="stylesheet" href="../../assets/style.css">
</head>
<body>
<div class="app-layout">
<aside class="app-sidebar">
<div class="sidebar-header">
<a href="../../index.html" class="sidebar-brand-link">
<div class="sidebar-logo">🐍</div>
<div>
<div class="sidebar-title">Python Portal</div>
<div class="sidebar-subtitle">Lernplattform</div>
</div>
</a>
</div>
<div class="sidebar-quick-nav">
<a href="../../index.html" class="sidebar-link">🏠 Startseite</a>
<a href="../../index.html#tutorial" class="sidebar-link">📖 Tutorial &amp; Workflow</a>
<a href="../../index.html#zertifikate" class="sidebar-link">🏆 Zertifikate</a>
</div>
<div class="sidebar-nav">
<div class="sidebar-group">
<div class="sidebar-group-title">
<span>🌱 1. Grundlagen</span>
<span style="background: rgba(255,255,255,0.1); padding: 2px 6px; border-radius: 99px; font-size: 0.7rem;">G01–G10</span>
</div>
<div style="display: flex; flex-direction: column; gap: 2px;">
<a href="../../lehrpfad_1_grundlagen/01_erste_schritte_taschenrechner/index.html" class="sidebar-link">
<span class="sidebar-link-icon">🧮</span>
<span class="sidebar-link-text">G01. Taschenrechner</span>
</a>
<a href="../../lehrpfad_1_grundlagen/02_variablen_und_datentypen/index.html" class="sidebar-link">
<span class="sidebar-link-icon">📦</span>
<span class="sidebar-link-text">G02. Variablen & Typen</span>
</a>
<a href="../../lehrpfad_1_grundlagen/03_ein_und_ausgabe/index.html" class="sidebar-link">
<span class="sidebar-link-icon">💬</span>
<span class="sidebar-link-text">G03. Ein- & Ausgabe</span>
</a>
<a href="../../lehrpfad_1_grundlagen/04_verzweigungen_und_bedingungen/index.html" class="sidebar-link">
<span class="sidebar-link-icon">🚦</span>
<span class="sidebar-link-text">G04. Bedingungen (if)</span>
</a>
<a href="../../lehrpfad_1_grundlagen/05_schleifen_und_wiederholungen/index.html" class="sidebar-link">
<span class="sidebar-link-icon">🎡</span>
<span class="sidebar-link-text">G05. Schleifen (for/while)</span>
</a>
<a href="../../lehrpfad_1_grundlagen/06_funktionen_und_module/index.html" class="sidebar-link active">
<span class="sidebar-link-icon">🪄</span>
<span class="sidebar-link-text">G06. Funktionen & Module</span>
</a>
<a href="../../lehrpfad_1_grundlagen/07_listen_und_sequenzen/index.html" class="sidebar-link">
<span class="sidebar-link-icon">📋</span>
<span class="sidebar-link-text">G07. Listen & Sequenzen</span>
</a>
<a href="../../lehrpfad_1_grundlagen/08_textverarbeitung_und_strings/index.html" class="sidebar-link">
<span class="sidebar-link-icon">🔤</span>
<span class="sidebar-link-text">G08. String-Methoden</span>
</a>
<a href="../../lehrpfad_1_grundlagen/09_dictionaries_und_sets/index.html" class="sidebar-link">
<span class="sidebar-link-icon">🗃️</span>
<span class="sidebar-link-text">G09. Dicts & Sets</span>
</a>
<a href="../../lehrpfad_1_grundlagen/10_comprehensions_datum_algorithmen/index.html" class="sidebar-link">
<span class="sidebar-link-icon">🚀</span>
<span class="sidebar-link-text">G10. Comprehensions</span>
</a>
</div>
</div>
<div class="sidebar-group">
<div class="sidebar-group-title">
<span>🏗️ 2. OOP Einstieg</span>
<span style="background: rgba(255,255,255,0.1); padding: 2px 6px; border-radius: 99px; font-size: 0.7rem;">00–06</span>
</div>
<div style="display: flex; flex-direction: column; gap: 2px;">
<a href="../../lehrpfad_2_oop_einstieg/00_fehlersuche_und_grundlagen/index.html" class="sidebar-link">
<span class="sidebar-link-icon">🔍</span>
<span class="sidebar-link-text">00. Fehlersuche & Debug</span>
</a>
<a href="../../lehrpfad_2_oop_einstieg/01_einstieg_klassen/index.html" class="sidebar-link">
<span class="sidebar-link-icon">🏗️</span>
<span class="sidebar-link-text">01. Einstieg in Klassen</span>
</a>
<a href="../../lehrpfad_2_oop_einstieg/02_init_und_self/index.html" class="sidebar-link">
<span class="sidebar-link-icon">⚙️</span>
<span class="sidebar-link-text">02. Konstruktor & self</span>
</a>
<a href="../../lehrpfad_2_oop_einstieg/03_methoden_und_verhalten/index.html" class="sidebar-link">
<span class="sidebar-link-icon">🏎️</span>
<span class="sidebar-link-text">03. Methoden & Verhalten</span>
</a>
<a href="../../lehrpfad_2_oop_einstieg/04_str_und_darstellung/index.html" class="sidebar-link">
<span class="sidebar-link-icon">🧾</span>
<span class="sidebar-link-text">04. __str__ Darstellung</span>
</a>
<a href="../../lehrpfad_2_oop_einstieg/04b_umstieg_vscode/index.html" class="sidebar-link">
<span class="sidebar-link-icon">💻</span>
<span class="sidebar-link-text">04b. VS Code Setup</span>
</a>
<a href="../../lehrpfad_2_oop_einstieg/04c_git_und_versionskontrolle/index.html" class="sidebar-link">
<span class="sidebar-link-icon">🌿</span>
<span class="sidebar-link-text">04c. Git-Versionskontrolle</span>
</a>
<a href="../../lehrpfad_2_oop_einstieg/05_objekte_kombinieren/index.html" class="sidebar-link">
<span class="sidebar-link-icon">🎵</span>
<span class="sidebar-link-text">05. Objekte kombinieren</span>
</a>
<a href="../../lehrpfad_2_oop_einstieg/06_abschlussprojekt_tamagotchi/index.html" class="sidebar-link">
<span class="sidebar-link-icon">🥚</span>
<span class="sidebar-link-text">06. Projekt: Tamagotchi</span>
</a>
</div>
</div>
<div class="sidebar-group">
<div class="sidebar-group-title">
<span>🚀 3. Fortgeschritten</span>
<span style="background: rgba(255,255,255,0.1); padding: 2px 6px; border-radius: 99px; font-size: 0.7rem;">07–16</span>
</div>
<div style="display: flex; flex-direction: column; gap: 2px;">
<a href="../../lehrpfad_3_fortgeschrittenes_oop/07_referenzen_und_speicher/index.html" class="sidebar-link">
<span class="sidebar-link-icon">🧠</span>
<span class="sidebar-link-text">07. Referenzen & Speicher</span>
</a>
<a href="../../lehrpfad_3_fortgeschrittenes_oop/08_operator_overloading_dunder/index.html" class="sidebar-link">
<span class="sidebar-link-icon">➕</span>
<span class="sidebar-link-text">08. Operator Overloading</span>
</a>
<a href="../../lehrpfad_3_fortgeschrittenes_oop/09_eigene_unit_tests_schreiben/index.html" class="sidebar-link">
<span class="sidebar-link-icon">🧪</span>
<span class="sidebar-link-text">09. Unit Tests & TDD</span>
</a>
<a href="../../lehrpfad_3_fortgeschrittenes_oop/10_vererbung_und_super/index.html" class="sidebar-link">
<span class="sidebar-link-icon">🧬</span>
<span class="sidebar-link-text">10. Vererbung & super()</span>
</a>
<a href="../../lehrpfad_3_fortgeschrittenes_oop/11_polymorphie_und_interfaces/index.html" class="sidebar-link">
<span class="sidebar-link-icon">🎭</span>
<span class="sidebar-link-text">11. Polymorphie</span>
</a>
<a href="../../lehrpfad_3_fortgeschrittenes_oop/12_exceptions_und_fehlerbehandlung/index.html" class="sidebar-link">
<span class="sidebar-link-icon">🛡️</span>
<span class="sidebar-link-text">12. Exceptions & Fehler</span>
</a>
<a href="../../lehrpfad_3_fortgeschrittenes_oop/13_persistenz_json_und_csv/index.html" class="sidebar-link">
<span class="sidebar-link-icon">💾</span>
<span class="sidebar-link-text">13. Persistenz (JSON/CSV)</span>
</a>
<a href="../../lehrpfad_3_fortgeschrittenes_oop/14_gui_mit_tkinter/index.html" class="sidebar-link">
<span class="sidebar-link-icon">🖥️</span>
<span class="sidebar-link-text">14. Desktop-GUIs (Tkinter)</span>
</a>
<a href="../../lehrpfad_3_fortgeschrittenes_oop/15_parameter_und_container/index.html" class="sidebar-link">
<span class="sidebar-link-icon">🎒</span>
<span class="sidebar-link-text">15. Container & *args</span>
</a>
<a href="../../lehrpfad_3_fortgeschrittenes_oop/16_master_abschlussprojekt/index.html" class="sidebar-link">
<span class="sidebar-link-icon">🏆</span>
<span class="sidebar-link-text">16. Master-Abschlussprojekt</span>
</a>
</div>
</div>
</div>
<div class="sidebar-footer">
<div style="display: flex; align-items: center; justify-content: space-between;">
<div style="font-size: 0.85rem; font-weight: 700; color: white;" id="sidebar-level-text">⭐ Level 1</div>
<div style="font-size: 0.82rem; font-weight: 700; color: #38bdf8;" id="sidebar-xp-text">0 XP</div>
</div>
</div>
</aside>
<div class="app-main">
<header>
<div class="header-container">
<nav class="nav-links">
<a href="../../index.html">🏠 Zur Kursübersicht</a>
<span>&rsaquo;</span>
<a href="../05_schleifen_und_wiederholungen/index.html">&larr; Kapitel G05</a>
<span>&rsaquo;</span>
<span style="color: white; font-weight: 600;">Kapitel G06</span>
<span>&rsaquo;</span>
<a href="../07_listen_und_sequenzen/index.html">Kapitel G07 &rarr;</a>
</nav>
<div class="header-badge">Grundlagen G06 &bull; Schulabgleich 05.0 &amp; 05.1</div>
<h1>Eigene Funktionen &amp; Module 🪄📦</h1>
<p>Lerne, wie du saubere Funktionen baust, Ergebnisse mit return zurückgibst, Variablen-Scopes verstehst und Standard-Module wie math und random nutzt.</p>
</div>
</header>
<main class="container">
<!-- 📂 Schnellzugriff & Download aller Dateien dieser Einheit -->
<div style="background: #ffffff; border: 1px solid var(--border-color); border-radius: var(--radius-md); padding: 14px 20px; margin-bottom: 25px; display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 12px; box-shadow: var(--shadow-sm);">
<div style="font-weight: 700; color: var(--text-main); display: flex; align-items: center; gap: 8px;">
<span>📂 Dateien dieser Einheit:</span>
</div>
<div style="display: flex; gap: 10px; flex-wrap: wrap;">
<a href="aufgabe.py" class="btn" style="padding: 6px 14px; font-size: 0.88rem; background: var(--primary);" download>📄 aufgabe.py (Startercode)</a>
<a href="test_aufgabe.py" class="btn btn-secondary" style="padding: 6px 14px; font-size: 0.88rem;" download>🧪 test_aufgabe.py (Tests)</a>
<a href="musterloesung.py" class="btn btn-secondary" style="padding: 6px 14px; font-size: 0.88rem;" download>💡 musterloesung.py (Lösung)</a>
<a href="README.md" class="btn btn-secondary" style="padding: 6px 14px; font-size: 0.88rem;">📖 README.md</a>
</div>
</div>
<!-- 1. Analogie & Grundkonzept -->
<section class="card">
<h2>1. Die Fabrik-Analogie: Was ist eine Funktion?</h2>
<p>
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!
</p>
<div class="box box-analogie">
<div class="box-title">🏭 Das 3-Schritte-Prinzip jeder Funktion:</div>
<ol style="margin-left: 20px; margin-top: 8px;">
<li><strong>Input (Parameter):</strong> Die Zutaten, die du beim Aufruf übergibst (z.B. zwei Zahlen: <code>a = 3</code>, <code>b = 4</code>).</li>
<li><strong>Verarbeitung:</strong> Die Rechenschritte im Inneren der Funktion (z.B. Satz des Pythagoras <code>c = math.sqrt(a**2 + b**2)</code>).</li>
<li><strong>Output (<code>return</code>):</strong> Das fertige Produkt, das an dein Hauptprogramm zurückgegeben wird (z.B. <code>5.0</code>).</li>
</ol>
</div>
</section>
<!-- 2. return vs print -->
<section class="card">
<h2>2. Der entscheidende Unterschied: <code>return</code> vs. <code>print()</code></h2>
<p>Das ist der häufigste Stolperstein für alle Programmieranfänger:</p>
<div class="extension-grid">
<div class="extension-card" style="border-left: 4px solid var(--warning);">
<div class="extension-icon" style="background: var(--warning-light); color: var(--warning);">🖨️</div>
<div class="extension-info">
<h4><code>print(...)</code></h4>
<p>Schreibt nur Text auf den Bildschirm. Das Programm kann mit der Bildschirmausgabe <strong>nicht</strong> weiterrechnen!</p>
</div>
</div>
<div class="extension-card" style="border-left: 4px solid var(--success);">
<div class="extension-icon" style="background: var(--success-light); color: var(--success);">📦</div>
<div class="extension-info">
<h4><code>return ...</code></h4>
<p>Übergibt den echten Wert zurück an den Aufrufer. Du kannst das Ergebnis in Variablen speichern und weiterverwenden!</p>
</div>
</div>
</div>
<div class="code-container">
<div class="code-header">
<div class="code-dots"><span class="code-dot dot-red"></span><span class="code-dot dot-yellow"></span><span class="code-dot dot-green"></span></div>
<span>Vergleich: print() vs. return</span>
</div>
<pre><span class="cm"># ❌ Falsch: Mit print() kann man nicht weiterrechnen</span>
<span class="kw">def</span> <span class="fn">quadrat_falsch</span>(<span class="var">x</span>):
<span class="fn">print</span>(<span class="var">x</span> * <span class="var">x</span>)
<span class="var">ergebnis</span> = <span class="fn">quadrat_falsch</span>(<span class="num">5</span>) <span class="cm"># Gibt 25 auf der Konsole aus, liefert aber None!</span>
<span class="cm"># print(ergebnis + 10) # 💥 TypeError: unsupported operand type for +: 'NoneType' and 'int'</span>
<span class="cm"># ✅ Richtig: Mit return kann der Wert weiterverwendet werden</span>
<span class="kw">def</span> <span class="fn">quadrat_richtig</span>(<span class="var">x</span>):
<span class="kw">return</span> <span class="var">x</span> * <span class="var">x</span>
<span class="var">ergebnis</span> = <span class="fn">quadrat_richtig</span>(<span class="num">5</span>) <span class="cm"># ergebnis ist jetzt der echte Wert 25!</span>
<span class="fn">print</span>(<span class="var">ergebnis</span> + <span class="num">10</span>) <span class="cm"># Funktioniert perfekt -> Ausgabe: 35</span></pre>
</div>
</section>
<!-- 3. Parameter, Default-Werte & Tupel-Return -->
<section class="card">
<h2>3. Standardwerte (Defaults) &amp; Mehrere Rückgabewerte</h2>
<p>Du kannst Parametern Standardwerte geben, die verwendet werden, wenn beim Aufruf kein Wert übergeben wird:</p>
<div class="code-container">
<div class="code-header">
<div class="code-dots"><span class="code-dot dot-red"></span><span class="code-dot dot-yellow"></span><span class="code-dot dot-green"></span></div>
<span>Python (Standardwerte und Tupel-Return)</span>
</div>
<pre><span class="cm"># Standardwert seiten=6 (W6 Spielwürfel)</span>
<span class="kw">def</span> <span class="fn">wuerfeln</span>(<span class="var">anzahl</span>: <span class="fn">int</span>, <span class="var">seiten</span>: <span class="fn">int</span> = <span class="num">6</span>) -> <span class="fn">list</span>[<span class="fn">int</span>]:
<span class="var">ergebnisse</span> = []
<span class="kw">for</span> <span class="var">_</span> <span class="kw">in</span> <span class="fn">range</span>(<span class="var">anzahl</span>):
<span class="var">ergebnisse</span>.<span class="fn">append</span>(<span class="var">random</span>.<span class="fn">randint</span>(<span class="num">1</span>, <span class="var">seiten</span>))
<span class="kw">return</span> <span class="var">ergebnisse</span>
<span class="fn">print</span>(<span class="fn">wuerfeln</span>(<span class="num">3</span>)) <span class="cm"># 3 normale 6-seitige Würfel</span>
<span class="fn">print</span>(<span class="fn">wuerfeln</span>(<span class="num">2</span>, <span class="var">seiten</span>=<span class="num">20</span>)) <span class="cm"># 2 20-seitige D20-Würfel</span></pre>
</div>
<h3>Mehrere Werte zurückgeben (Tuple-Unpacking):</h3>
<p>Trenne Rückgabewerte einfach mit Kommas. Beim Aufruf kannst du sie direkt in separate Variablen entpacken:</p>
<div class="code-container">
<div class="code-header">
<span>Python (Mehrere Rückgabewerte)</span>
</div>
<pre><span class="kw">def</span> <span class="fn">min_max_spanne</span>(<span class="var">werte</span>: <span class="fn">list</span>[<span class="fn">float</span>]) -> <span class="fn">tuple</span>[<span class="fn">float</span>, <span class="fn">float</span>]:
<span class="kw">return</span> <span class="fn">min</span>(<span class="var">werte</span>), <span class="fn">max</span>(<span class="var">werte</span>)
<span class="cm"># Beide Werte auf einmal entpacken:</span>
<span class="var">tiefster</span>, <span class="var">hoechster</span> = <span class="fn">min_max_spanne</span>([<span class="num">12.5</span>, <span class="num">3.1</span>, <span class="num">18.9</span>])
<span class="fn">print</span>(<span class="str">f"Minimum: {tiefster}, Maximum: {hoechster}"</span>)</pre>
</div>
</section>
<!-- 4. Scope: Lokal vs. Global -->
<section class="card">
<h2>4. Gültigkeitsbereich: Lokaler vs. Globaler Scope 🏠</h2>
<div class="box box-tipp">
<div class="box-title">🏨 Die Hotelzimmer-Regel:</div>
Variablen, die <strong>innerhalb</strong> einer Funktion erstellt werden (z.B. Zwischenergebnisse oder Zähler), sind <strong>lokal</strong>. Sie existieren nur für die Dauer des Funktionsaufrufs und sind von außen unsichtbar und unzugänglich.
</div>
<div class="code-container">
<div class="code-header"><span>Scope-Veranschaulichung</span></div>
<pre><span class="var">globaler_name</span> = <span class="str">"Alice"</span> <span class="cm"># Überall im gesamten Programm sichtbar</span>
<span class="kw">def</span> <span class="fn">geheimnis</span>():
<span class="var">lokales_passwort</span> = <span class="str">"Geheim123"</span> <span class="cm"># Nur HIER DRINNEN sichtbar!</span>
<span class="fn">print</span>(<span class="str">"In Funktion:"</span>, <span class="var">lokales_passwort</span>)
<span class="fn">geheimnis</span>()
<span class="cm"># print(lokales_passwort) # 💥 NameError: name 'lokales_passwort' is not defined!</span></pre>
</div>
</section>
<!-- 5. Die Standardbibliothek Module -->
<section class="card">
<h2>5. Die Python-Werkzeugkiste: Module <code>math</code> &amp; <code>random</code></h2>
<p>Python bringt hunderte nützliche Module mit. Du bindest sie mit <code>import modulname</code> am Anfang deiner Datei ein:</p>
<div class="extension-grid">
<div class="extension-card">
<div class="extension-icon" style="background: #e0f2fe; color: #0284c7;">📐</div>
<div class="extension-info">
<h4>Modul <code>math</code></h4>
<p><strong><code>math.sqrt(x)</code>:</strong> Quadratwurzel von x<br>
<strong><code>math.pi</code>:</strong> Kreiszahl &pi; &approx; 3.14159...<br>
<strong><code>math.pow(b, e)</code>:</strong> Potenzieren $b^e$<br>
<strong><code>math.floor(x)</code> / <code>math.ceil(x)</code>:</strong> Ab-/Aufrunden</p>
</div>
</div>
<div class="extension-card">
<div class="extension-icon" style="background: #fdf4ff; color: #a855f7;">🎲</div>
<div class="extension-info">
<h4>Modul <code>random</code></h4>
<p><strong><code>random.randint(a, b)</code>:</strong> Zufalls-Ganzzahl von a bis b<br>
<strong><code>random.random()</code>:</strong> Zufalls-Float zwischen 0.0 und 1.0<br>
<strong><code>random.choice(liste)</code>:</strong> Zufälliges Element wählen<br>
<strong><code>random.shuffle(liste)</code>:</strong> Liste mischen</p>
</div>
</div>
</div>
</section>
<!-- 6. Aufgaben & Checkliste -->
<section class="card">
<h2>6. 🎯 Deine Aufgaben in <code><a href="aufgabe.py" style="color: inherit; text-decoration: underline;">aufgabe.py</a></code></h2>
<p>Öffne die Datei <code><a href="aufgabe.py" style="color: inherit; text-decoration: underline;">aufgabe.py</a></code> und bearbeite die folgenden 4 Aufgaben:</p>
<ul class="task-list">
<li class="task-item">
<input type="checkbox" class="task-checkbox" id="t1">
<label for="t1" class="task-label">
<strong>TODO 1: <code>hypotenuse(a: float, b: float) -> float</code></strong><br>
Berechnet $c = \sqrt{a^2 + b^2}$ mittels <code>math.sqrt</code>. Löst einen <code>ValueError</code> aus bei negativen Seitenlängen.
</label>
</li>
<li class="task-item">
<input type="checkbox" class="task-checkbox" id="t2">
<label for="t2" class="task-label">
<strong>TODO 2: <code>zylinder_volumen(radius: float, hoehe: float) -> float</code></strong><br>
Berechnet $V = \pi \cdot r^2 \cdot h$ mittels <code>math.pi</code>. Löst einen <code>ValueError</code> aus, wenn <code>radius < 0</code> oder <code>hoehe < 0</code>.
</label>
</li>
<li class="task-item">
<input type="checkbox" class="task-checkbox" id="t3">
<label for="t3" class="task-label">
<strong>TODO 3: <code>wuerfle_wuerfel(anzahl: int, seiten: int = 6) -> list[int]</code></strong><br>
Simuliert Würfe mit <code>random.randint(1, seiten)</code>. Standardwert ist <code>seiten=6</code>. Löst einen <code>ValueError</code> aus bei <code>anzahl < 0</code> oder <code>seiten < 1</code>.
</label>
</li>
<li class="task-item">
<input type="checkbox" class="task-checkbox" id="t4">
<label for="t4" class="task-label">
<strong>TODO 4: <code>statistik(zahlen: list[float]) -> tuple[float, float, float]</code></strong><br>
Gibt das 3er-Tupel <code>(min_wert, max_wert, mittelwert)</code> zurück. Löst einen <code>ValueError</code> aus, falls die Liste leer ist.
</label>
</li>
</ul>
<h3>💡 Lösungshinweise (Aufklappen bei Bedarf)</h3>
<details>
<summary>🔍 Tipp zu TODO 1 &amp; 2 (Geometrie mit math)</summary>
<div class="details-content">
<div class="code-container">
<pre><span class="kw">import</span> <span class="var">math</span>
<span class="kw">def</span> <span class="fn">hypotenuse</span>(<span class="var">a</span>: <span class="fn">float</span>, <span class="var">b</span>: <span class="fn">float</span>) -> <span class="fn">float</span>:
<span class="kw">if</span> <span class="var">a</span> &lt; <span class="num">0</span> <span class="kw">or</span> <span class="var">b</span> &lt; <span class="num">0</span>:
<span class="kw">raise</span> <span class="fn">ValueError</span>(<span class="str">"Seitenlängen dürfen nicht negativ sein"</span>)
<span class="kw">return</span> <span class="var">math</span>.<span class="fn">sqrt</span>(<span class="var">a</span>**<span class="num">2</span> + <span class="var">b</span>**<span class="num">2</span>)</pre>
</div>
</div>
</details>
<details>
<summary>🔍 Tipp zu TODO 3 (Würfelsimulator mit random)</summary>
<div class="details-content">
<div class="code-container">
<pre><span class="kw">import</span> <span class="var">random</span>
<span class="kw">def</span> <span class="fn">wuerfle_wuerfel</span>(<span class="var">anzahl</span>: <span class="fn">int</span>, <span class="var">seiten</span>: <span class="fn">int</span> = <span class="num">6</span>) -> <span class="fn">list</span>[<span class="fn">int</span>]:
<span class="kw">if</span> <span class="var">anzahl</span> &lt; <span class="num">0</span> <span class="kw">or</span> <span class="var">seiten</span> &lt; <span class="num">1</span>:
<span class="kw">raise</span> <span class="fn">ValueError</span>(<span class="str">"Ungültige Würfel-Parameter"</span>)
<span class="var">ergebnisse</span> = []
<span class="kw">for</span> <span class="var">_</span> <span class="kw">in</span> <span class="fn">range</span>(<span class="var">anzahl</span>):
<span class="var">ergebnisse</span>.<span class="fn">append</span>(<span class="var">random</span>.<span class="fn">randint</span>(<span class="num">1</span>, <span class="var">seiten</span>))
<span class="kw">return</span> <span class="var">ergebnisse</span></pre>
</div>
</div>
</details>
<details>
<summary>🔍 Tipp zu TODO 4 (Statistik &amp; Tupel-Return)</summary>
<div class="details-content">
<div class="code-container">
<pre><span class="kw">def</span> <span class="fn">statistik</span>(<span class="var">zahlen</span>: <span class="fn">list</span>[<span class="fn">float</span>]) -> <span class="fn">tuple</span>[<span class="fn">float</span>, <span class="fn">float</span>, <span class="fn">float</span>]:
<span class="kw">if</span> <span class="kw">not</span> <span class="var">zahlen</span>:
<span class="kw">raise</span> <span class="fn">ValueError</span>(<span class="str">"Die Liste darf nicht leer sein"</span>)
<span class="kw">return</span> <span class="fn">min</span>(<span class="var">zahlen</span>), <span class="fn">max</span>(<span class="var">zahlen</span>), <span class="fn">sum</span>(<span class="var">zahlen</span>) / <span class="fn">len</span>(<span class="var">zahlen</span>)</pre>
</div>
</div>
</details>
</section>
<!-- 7. Testen & Navigation -->
<section class="card">
<h2>7. 🧪 Testen &amp; Weitergehen</h2>
<p>Führe im Terminal den Unittest aus:</p>
<div class="code-container">
<div class="code-header"><span>Terminal</span></div>
<pre><code>python3 test_aufgabe.py</code></pre>
</div>
<div class="footer-nav">
<a href="../05_schleifen_und_wiederholungen/index.html" class="btn btn-secondary">&larr; Zurück zu Kapitel G05</a>
<a href="../07_listen_und_sequenzen/index.html" class="btn">Weiter zu Kapitel G07 (Listen &amp; Sequenzen) &rarr;</a>
</div>
</section>
</main>
</div>
</div>
<button type="button" class="sidebar-mobile-toggle"><span>☰ Menü</span></button>
<div class="sidebar-overlay"></div>
<!-- Scripts -->
<script src="../../assets/gamification_data.js"></script>
<script src="../../assets/gamification.js"></script>
<script src="../../assets/interpreter.js"></script>
<script src="../../assets/certificate.js"></script>
<script src="../../assets/parsons.js"></script>
<script src="../../assets/runner.js"></script>
<script src="../../assets/ui_enhancements.js"></script>
<script src="../../assets/sidebar.js"></script>
</body>
</html>