Aufgaben-Python/lehrpfad_1_grundlagen/10_comprehensions_datum_algorithmen/index.html

276 lines
16 KiB
HTML

<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Kapitel G10: Comprehensions, Datum &amp; Algorithmen</title>
<link rel="stylesheet" href="../../assets/style.css">
</head>
<body>
<header>
<div class="header-container">
<nav class="nav-links">
<a href="../../index.html">🏠 Zur Kursübersicht</a>
<span>&rsaquo;</span>
<a href="../09_dictionaries_und_sets/index.html">&larr; Kapitel G09</a>
<span>&rsaquo;</span>
<span style="color: white; font-weight: 600;">Kapitel G10</span>
<span>&rsaquo;</span>
<a href="../../lehrpfad_2_oop_einstieg/00_fehlersuche_und_grundlagen/index.html">Lehrpfad 2: OOP &rarr;</a>
</nav>
<div class="header-badge">Kapitel G10 &bull; Schulabgleich 13.0 &amp; 15.1</div>
<h1>Comprehensions, Datum &amp; Algorithmen 🚀📅</h1>
<p>Lerne, wie du elegante Einzeiler schreibst, mit Zeitspannen rechnest und grundlegende Such- und Filter-Algorithmen meisterst.</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. List Comprehensions: Das Schnellschienen-Fließband -->
<section class="card">
<h2>1. List Comprehensions: Das Schnellschienen-Fließband</h2>
<p>
In Python musst du nicht jedes Mal eine leere Liste erstellen und eine 4-zeilige <code>for</code>-Schleife mit <code>.append()</code> schreiben.
Mit <strong>List Comprehensions</strong> erstellst und filterst du Listen in einer einzigen, eleganten Zeile!
</p>
<div class="box box-analogie">
<div class="box-title">🏭 Die Fließband- &amp; Filtersieb-Analogie:</div>
<p>Stell dir ein automatisiertes Fließband in einer Manufaktur vor:</p>
<ul style="margin-left: 20px; margin-top: 8px;">
<li>Die Rohstoffe (Elemente aus der Ausgangsliste) laufen über das Band (<code>for x in liste</code>).</li>
<li>Ein Sensor sortiert unpassende Teile sofort aus (<code>if x % 2 == 0</code>).</li>
<li>Am Ende wird das Teil direkt veredelt oder berechnet (<code>x ** 2</code>) und fällt fertig verpackt in die neue Liste!</li>
</ul>
</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: Traditionelle Schleife vs. List Comprehension</span>
</div>
<pre><span class="cm"># 🐢 Vorher: Traditionelle for-Schleife (4 Zeilen)</span>
<span class="var">gerade_quadrate</span> = []
<span class="kw">for</span> <span class="var">x</span> <span class="kw">in</span> <span class="fn">range</span>(<span class="num">1</span>, <span class="num">7</span>):
<span class="kw">if</span> <span class="var">x</span> % <span class="num">2</span> == <span class="num">0</span>:
<span class="var">gerade_quadrate</span>.<span class="fn">append</span>(<span class="var">x</span> ** <span class="num">2</span>)
<span class="cm"># 🚀 Nachher: Elegante List Comprehension (1 Zeile!)</span>
<span class="var">gerade_quadrate</span> = [<span class="var">x</span> ** <span class="num">2</span> <span class="kw">for</span> <span class="var">x</span> <span class="kw">in</span> <span class="fn">range</span>(<span class="num">1</span>, <span class="num">7</span>) <span class="kw">if</span> <span class="var">x</span> % <span class="num">2</span> == <span class="num">0</span>]
<span class="fn">print</span>(<span class="var">gerade_quadrate</span>) <span class="cm"># [4, 16, 36]</span></pre>
</div>
<h3>Dict Comprehensions: Dictionaries on the fly</h3>
<div class="code-container">
<div class="code-header"><span>Dict Comprehension Syntax</span></div>
<pre><span class="var">woerter</span> = [<span class="str">"Python"</span>, <span class="str">"Code"</span>, <span class="str">"Entwicklung"</span>]
<span class="var">laengen</span> = {<span class="var">w</span>: <span class="fn">len</span>(<span class="var">w</span>) <span class="kw">for</span> <span class="var">w</span> <span class="kw">in</span> <span class="var">woerter</span>}
<span class="fn">print</span>(<span class="var">laengen</span>) <span class="cm"># {'Python': 6, 'Code': 4, 'Entwicklung': 11}</span></pre>
</div>
</section>
<!-- 2. Datum & Zeit mit datetime -->
<section class="card">
<h2>2. Datum, Uhrzeit &amp; Zeitspannen (Das <code>datetime</code>-Modul)</h2>
<p>
Egal ob Ticket-Buchung, Geburtstags-Erinnerung oder Spielstand-Speicherung: Zeitberechnungen gehören zum Alltag jeder Programmiererin.
</p>
<div class="box box-analogie">
<div class="box-title">🗓️ Die Kalender- &amp; Stoppuhr-Analogie:</div>
<ul style="margin-left: 20px; margin-top: 8px;">
<li><code>date</code> &amp; <code>datetime</code> sind wie dein Kalender: Ein festes Datum wie der 24.12.2026.</li>
<li><code>timedelta</code> ist wie eine Zeitspanne (z.B. "+ 14 Tage" oder "- 3 Stunden").</li>
</ul>
</div>
<div class="code-container">
<div class="code-header">
<span>Python: Rechnen mit datetime &amp; timedelta</span>
</div>
<pre><span class="kw">from</span> <span class="var">datetime</span> <span class="kw">import</span> <span class="var">datetime</span>, <span class="var">date</span>, <span class="var">timedelta</span>
<span class="cm"># 1. Heute ermitteln:</span>
<span class="var">heute</span> = <span class="var">date</span>.<span class="fn">today</span>()
<span class="cm"># 2. Text in Datum parsen (.strptime):</span>
<span class="var">urlaub</span> = <span class="var">datetime</span>.<span class="fn">strptime</span>(<span class="str">"2026-07-15"</span>, <span class="str">"%Y-%m-%d"</span>).<span class="fn">date</span>()
<span class="cm"># 3. Differenz in Tagen berechnen:</span>
<span class="var">tage_bis_urlaub</span> = (<span class="var">urlaub</span> - <span class="var">heute</span>).<span class="attr">days</span>
<span class="fn">print</span>(<span class="str">f"Noch {tage_bis_urlaub} Tage bis zum Urlaub!"</span>)
<span class="cm"># 4. Deutsches Datumsformat ausgeben (.strftime):</span>
<span class="fn">print</span>(<span class="var">urlaub</span>.<span class="fn">strftime</span>(<span class="str">"%d.%m.%Y"</span>)) <span class="cm"># Ausgabe: "15.07.2026"</span></pre>
</div>
<h3>Wichtige Formatierungs-Kürzel</h3>
<table style="width: 100%; border-collapse: collapse; margin: 15px 0;">
<thead>
<tr style="background: var(--primary-light); text-align: left;">
<th style="padding: 10px; border: 1px solid var(--border-color);">Kürzel</th>
<th style="padding: 10px; border: 1px solid var(--border-color);">Bedeutung</th>
<th style="padding: 10px; border: 1px solid var(--border-color);">Beispiel</th>
</tr>
</thead>
<tbody>
<tr>
<td style="padding: 10px; border: 1px solid var(--border-color);"><code>%d</code></td>
<td style="padding: 10px; border: 1px solid var(--border-color);">Tag im Monat mit führender Null (01..31)</td>
<td style="padding: 10px; border: 1px solid var(--border-color);"><code>05</code> oder <code>29</code></td>
</tr>
<tr style="background: #fafafa;">
<td style="padding: 10px; border: 1px solid var(--border-color);"><code>%m</code></td>
<td style="padding: 10px; border: 1px solid var(--border-color);">Monat mit führender Null (01..12)</td>
<td style="padding: 10px; border: 1px solid var(--border-color);"><code>08</code></td>
</tr>
<tr>
<td style="padding: 10px; border: 1px solid var(--border-color);"><code>%Y</code></td>
<td style="padding: 10px; border: 1px solid var(--border-color);">Vierstelliges Jahr</td>
<td style="padding: 10px; border: 1px solid var(--border-color);"><code>2026</code></td>
</tr>
</tbody>
</table>
</section>
<!-- 3. Grundlegende Algorithmen -->
<section class="card">
<h2>3. Grundlegende Algorithmen: Min/Max, Suchen &amp; Sortieren</h2>
<p>
Ein <strong>Algorithmus</strong> ist eine präzise Handlungsanweisung zur Lösung eines Problems.
Hier lernst du die wichtigsten Muster kennen:
</p>
<div class="code-container">
<div class="code-header">
<span>Maximum suchen mit key=</span>
</div>
<pre><span class="var">personen</span> = [
{<span class="str">"name"</span>: <span class="str">"Anna"</span>, <span class="str">"alter"</span>: <span class="num">25</span>},
{<span class="str">"name"</span>: <span class="str">"Ben"</span>, <span class="str">"alter"</span>: <span class="num">32</span>},
{<span class="str">"name"</span>: <span class="str">"Clara"</span>, <span class="str">"alter"</span>: <span class="num">19</span>}
]
<span class="cm"># Die älteste Person mit max() und Lambda-Schlüssel finden:</span>
<span class="var">aelteste</span> = <span class="fn">max</span>(<span class="var">personen</span>, <span class="var">key</span>=<span class="kw">lambda</span> <span class="var">p</span>: <span class="var">p</span>[<span class="str">"alter"</span>])
<span class="fn">print</span>(<span class="str">f"Älteste Person: {aelteste['name']} ({aelteste['alter']} Jahre)"</span>)
<span class="cm"># Ausgabe: Älteste Person: Ben (32 Jahre)</span></pre>
</div>
</section>
<!-- 4. Aufgaben & Checkliste -->
<section class="card">
<h2>4. 🎯 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 5 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>quadratzahlen_gerade</code>):</strong> Erzeuge mit einer List Comprehension eine Liste mit den Quadraten aller geraden Zahlen.
</label>
</li>
<li class="task-item">
<input type="checkbox" class="task-checkbox" id="t2">
<label for="t2" class="task-label">
<strong>TODO 2 (<code>filtriere_lange_woerter</code>):</strong> Filtere alle Wörter heraus, deren Zeichenlänge mindestens <code>min_laenge</code> beträgt.
</label>
</li>
<li class="task-item">
<input type="checkbox" class="task-checkbox" id="t3">
<label for="t3" class="task-label">
<strong>TODO 3 (<code>tage_bis_datum</code>):</strong> Parse ein Datums-String (<code>YYYY-MM-DD</code>) und berechne die Differenz in Tagen zu heute.
</label>
</li>
<li class="task-item">
<input type="checkbox" class="task-checkbox" id="t4">
<label for="t4" class="task-label">
<strong>TODO 4 (<code>formatiere_deutsches_datum</code>):</strong> Formatiere ein <code>date</code>- oder <code>datetime</code>-Objekt mit <code>.strftime()</code> im Format <code>DD.MM.YYYY</code>.
</label>
</li>
<li class="task-item">
<input type="checkbox" class="task-checkbox" id="t5">
<label for="t5" class="task-label">
<strong>TODO 5 (<code>finde_aelteste_person</code>):</strong> Suche in einer Liste von Personen-Dictionaries die Person mit dem größten Alter und gib ihren Namen zurück (oder <code>""</code> bei leerer Liste).
</label>
</li>
</ul>
<h3>💡 Lösungshinweise (Aufklappen bei Bedarf)</h3>
<details>
<summary>🔍 Tipp zu TODO 1 &amp; 2 (List Comprehensions)</summary>
<div class="details-content">
<div class="code-container">
<pre><span class="cm"># TODO 1:</span>
<span class="kw">return</span> [<span class="var">x</span> ** <span class="num">2</span> <span class="kw">for</span> <span class="var">x</span> <span class="kw">in</span> <span class="var">zahlen</span> <span class="kw">if</span> <span class="var">x</span> % <span class="num">2</span> == <span class="num">0</span>]
<span class="cm"># TODO 2:</span>
<span class="kw">return</span> [<span class="var">w</span> <span class="kw">for</span> <span class="var">w</span> <span class="kw">in</span> <span class="var">woerter</span> <span class="kw">if</span> <span class="fn">len</span>(<span class="var">w</span>) >= <span class="var">min_laenge</span>]</pre>
</div>
</div>
</details>
<details>
<summary>🔍 Tipp zu TODO 3 (Datum einlesen &amp; subtrahieren)</summary>
<div class="details-content">
<div class="code-container">
<pre><span class="var">ziel</span> = <span class="var">datetime</span>.<span class="fn">strptime</span>(<span class="var">ziel_datum_str</span>, <span class="str">"%Y-%m-%d"</span>).<span class="fn">date</span>()
<span class="var">heute</span> = <span class="var">date</span>.<span class="fn">today</span>()
<span class="kw">return</span> (<span class="var">ziel</span> - <span class="var">heute</span>).<span class="attr">days</span></pre>
</div>
</div>
</details>
</section>
<!-- 5. Testen & Navigation -->
<section class="card">
<h2>5. 🧪 Lösung überprüfen &amp; Kursabschluss</h2>
<p>Führe den Test im Terminal 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="../09_dictionaries_und_sets/index.html" class="btn btn-secondary">&larr; Zurück zu Kapitel G09</a>
<a href="../../lehrpfad_2_oop_einstieg/00_fehlersuche_und_grundlagen/index.html" class="btn">Weiter zu Lehrpfad 2: OOP &amp; Klassen &rarr;</a>
</div>
</section>
</main>
<!-- Lokale Gamification-Scripts (funktionieren auch offline per Doppelklick via file://) -->
<script src="../../assets/gamification_data.js"></script>
<script src="../../assets/gamification.js"></script>
<script src="../../assets/parsons.js"></script>
<script src="../../assets/interpreter.js"></script>
<script src="../../assets/ui_enhancements.js"></script>
</body>
</html>