259 lines
14 KiB
HTML
259 lines
14 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 & 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>›</span>
|
|
<a href="../g09_dictionaries_und_sets/index.html">← Kapitel G09</a>
|
|
<span>›</span>
|
|
<span style="color: white; font-weight: 600;">Kapitel G10</span>
|
|
<span>›</span>
|
|
<a href="../00_fehlersuche_und_grundlagen/index.html">Lehrpfad 2: OOP →</a>
|
|
</nav>
|
|
<div class="header-badge">Kapitel G10 • Schulabgleich 13.0 & 15.1</div>
|
|
<h1>Comprehensions, Datum & 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">
|
|
|
|
<!-- 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- & 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 & 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- & Stoppuhr-Analogie:</div>
|
|
<ul style="margin-left: 20px; margin-top: 8px;">
|
|
<li><code>date</code> & <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 & 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 & 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>aufgabe.py</code></h2>
|
|
|
|
<p>Öffne die Datei <code>g10_comprehensions_datum_algorithmen/aufgabe.py</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 & 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 & 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 & 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="../g09_dictionaries_und_sets/index.html" class="btn btn-secondary">← Zurück zu Kapitel G09</a>
|
|
<a href="../00_fehlersuche_und_grundlagen/index.html" class="btn">Weiter zu Lehrpfad 2: OOP & Klassen →</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>
|
|
</body>
|
|
</html>
|