Python – 09 Algorithmen und Abschlussübung
Voraussetzungen
Bevor du mit diesem Modul startest, solltest du bereits vertraut sein mit:
- Python – 07 Funktionen und Methoden - Funktionen erstellen und nutzen
Lernziele
In diesem abschließenden Modul zu den Python-Grundlagen wirst du:
- Dein gesamtes Python-Wissen in einem größeren Projekt anwenden
- Einfache Algorithmen selbstständig entwickeln und implementieren
- Alle Datentypen, Kontrollstrukturen und Funktionen kombinieren
- Code strukturiert und nachvollziehbar schreiben
Rückblick: Was du bereits kannst
Du hast in den letzten Modulen folgendes gelernt:
- Datentypen: Strings, Integers, Floats, Booleans, Listen
- Operationen: Rechnen, String-Operationen, Vergleiche, logische Verknüpfungen
- Kontrollstrukturen: if-else, for-Schleifen, while-Schleifen
- Funktionen: Eigene Funktionen definieren, Parameter übergeben, return nutzen
Jetzt kombinieren wir all das!
(Notiz: )
1. Algorithmen verstehen
Ein Algorithmus ist eine präzise, schrittweise Anleitung zur Lösung eines Problems. In der Programmierung sind Algorithmen die Grundlage für jedes Programm.
Merkmale guter Algorithmen
- Eindeutigkeit: Jeder Schritt ist klar definiert
- Endlichkeit: Der Algorithmus endet nach endlich vielen Schritten
- Effizienz: Möglichst wenig Ressourcen (Zeit, Speicher)
- Korrektheit: Liefert für alle Eingaben das richtige Ergebnis
Beispiel: Algorithmus “Größte Zahl finden”
Problem: Finde die größte Zahl in einer Liste.
Algorithmus (Pseudocode):
1. Setze maximum = erstes Element der Liste
2. Für jedes Element in der Liste:
a. Wenn Element > maximum:
- Setze maximum = Element
3. Gib maximum zurückPython-Implementierung:
| |
2. Algorithmus-Aufgaben
Aufgabe 1: Summe berechnen
Schreibe eine Funktion berechne_summe(zahlen), die die Summe aller Zahlen in einer Liste berechnet.
Anforderungen:
- Nutze eine for-Schleife
- Nutze eine Variable
summe, die bei 0 startet - Gib die Summe mit
returnzurück
Testfall:
| |
Lösung zeigen
1 2 3 4 5 6 7 8 9 10 11 12def berechne_summe(zahlen: list[int]) -> int: """Berechnet die Summe aller Zahlen in einer Liste.""" summe = 0 for zahl in zahlen: summe += zahl return summe # Test print(berechne_summe([1, 2, 3, 4, 5])) # Ausgabe: 15 print(berechne_summe([10, 20, 30])) # Ausgabe: 60
Aufgabe 2: Durchschnitt berechnen
Schreibe eine Funktion berechne_durchschnitt(zahlen), die den Durchschnitt aller Zahlen in einer Liste berechnet.
Tipp: Nutze deine berechne_summe() Funktion von Aufgabe 1!
Testfall:
| |
Lösung zeigen
1 2 3 4 5 6 7 8 9 10 11def berechne_durchschnitt(zahlen: list[int | float]) -> float: """Berechnet den Durchschnitt aller Zahlen in einer Liste.""" summe = berechne_summe(zahlen) anzahl = len(zahlen) durchschnitt = summe / anzahl return durchschnitt # Test print(berechne_durchschnitt([10, 20, 30])) # Ausgabe: 20.0 print(berechne_durchschnitt([5, 10, 15, 20])) # Ausgabe: 12.5
Aufgabe 3: Gerade Zahlen filtern
Schreibe eine Funktion filtere_gerade(zahlen), die eine neue Liste mit nur den geraden Zahlen zurückgibt.
Tipp: Eine Zahl ist gerade, wenn zahl % 2 == 0
Testfall:
| |
Lösung zeigen
1 2 3 4 5 6 7 8 9 10 11 12 13def filtere_gerade(zahlen: list[int]) -> list[int]: """Filtert alle geraden Zahlen aus einer Liste.""" gerade_zahlen = [] for zahl in zahlen: if zahl % 2 == 0: gerade_zahlen.append(zahl) return gerade_zahlen # Test print(filtere_gerade([1, 2, 3, 4, 5, 6])) # Ausgabe: [2, 4, 6] print(filtere_gerade([10, 15, 20, 25, 30])) # Ausgabe: [10, 20, 30]
Aufgabe 4: Passwort-Validator
Schreibe eine Funktion validiere_passwort(passwort), die prüft, ob ein Passwort sicher ist.
Anforderungen für ein sicheres Passwort:
- Mindestens 8 Zeichen lang
- Enthält mindestens eine Zahl
- Enthält mindestens einen Großbuchstaben
Rückgabe: True wenn sicher, False wenn nicht
Testfälle:
| |
Lösung zeigen
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35def validiere_passwort(passwort: str) -> bool: """Prüft, ob ein Passwort den Sicherheitsanforderungen entspricht.""" # Prüfung 1: Länge if len(passwort) < 8: return False # Prüfung 2: Enthält Zahl hat_zahl = False for zeichen in passwort: if zeichen.isdigit(): hat_zahl = True break if not hat_zahl: return False # Prüfung 3: Enthält Großbuchstaben hat_grossbuchstabe = False for zeichen in passwort: if zeichen.isupper(): hat_grossbuchstabe = True break if not hat_grossbuchstabe: return False # Alle Prüfungen bestanden return True # Tests print(validiere_passwort("Hallo123")) # Ausgabe: True print(validiere_passwort("hallo")) # Ausgabe: False print(validiere_passwort("Hallo")) # Ausgabe: False print(validiere_passwort("PASSWORD1")) # Ausgabe: TrueAlternative elegantere Lösung:
1 2 3 4 5 6 7 8 9 10def validiere_passwort(passwort: str) -> bool: """Prüft, ob ein Passwort den Sicherheitsanforderungen entspricht.""" # Alle Bedingungen prüfen lang_genug = len(passwort) >= 8 hat_zahl = any(zeichen.isdigit() for zeichen in passwort) hat_grossbuchstabe = any(zeichen.isupper() for zeichen in passwort) # Alle Bedingungen müssen wahr sein return lang_genug and hat_zahl and hat_grossbuchstabe
3. Abschlussaufgabe: Steckbrief-Programm
Jetzt kombinierst du alle Python-Grundlagen in einem größeren Projekt!
Aufgabe 5: Steckbrief
Erstelle ein Steckbrief zu einer Schülerin oder einem Schüler in deinem Kurs. Führe dazu ein Interview.
Schritt 1: Datensammlung
Lege folgende Variablen an (nutze type hints, siehe Python – 08 Type Hints):
vorname: strnachname: stralter: intmag_mathe: boollieblingsfach: strhobbys: list[str](mindestens 3 Einträge)motto: strnote_mathe: float
Erstelle eine Liste
steckbrief, die alle diese Variablen enthält
Schritt 2: Funktionen Schreibe mindestens 2 Funktionen, z.B.:
zeige_steckbrief(steckbrief)– Gibt den Steckbrief formatiert ausberechne_geburtsjahr(alter)– Berechnet das ungefähre Geburtsjahrist_gut_in_mathe(note)– Gibt zurück, ob die Note besser als 3,0 ist
Schritt 3: Ausgabe
- Nutze deine Funktionen, um den Steckbrief ansprechend auszugeben
- Nutze if-else, um personalisierte Nachrichten auszugeben
Beispiel-Ausgabe:
=== STECKBRIEF ===
Name: Anna Müller
Alter: 16
Lieblingsfach: Informatik
Mag Mathe: Ja
Mathe-Note: 2.3 - Das ist gut!
Hobbys: Programmieren, Basketball, Lesen
Motto: "Code is poetry"Abgabe:
- Schreibe in die erste Zeile als Kommentar:
# 2025-12-12, [Dein Name], Abschlussaufgabe Python 09 - Gib die Datei im vereinbarten Speicherort ab
Beispiel-Lösung zeigen
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51# 2025-12-12, Max Mustermann, Abschlussaufgabe Python 09 # Variablen mit Type Hints vorname: str = "Anna" nachname: str = "Müller" alter: int = 16 mag_mathe: bool = True lieblingsfach: str = "Informatik" hobbys: list[str] = ["Programmieren", "Basketball", "Lesen"] motto: str = "Code is poetry" note_mathe: float = 2.3 # Liste mit allen Daten steckbrief = [vorname, nachname, alter, mag_mathe, lieblingsfach, hobbys, motto, note_mathe] # Funktionen def berechne_geburtsjahr(alter: int) -> int: """Berechnet das ungefähre Geburtsjahr.""" aktuelles_jahr = 2026 # Passe das aktuelle Jahr ggf. an return aktuelles_jahr - alter def ist_gut_in_mathe(note: float) -> bool: """Prüft, ob die Mathe-Note gut ist (besser als 3.0).""" return note < 3.0 def zeige_steckbrief(daten: list) -> None: """Zeigt den Steckbrief formatiert an.""" print("=" * 30) print(" STECKBRIEF") print("=" * 30) print(f"Name: {daten[0]} {daten[1]}") print(f"Alter: {daten[2]} (geboren ca. {berechne_geburtsjahr(daten[2])})") print(f"Lieblingsfach: {daten[4]}") if daten[3]: print("Mag Mathe: Ja") else: print("Mag Mathe: Nein") mathe_note = daten[7] if ist_gut_in_mathe(mathe_note): print(f"Mathe-Note: {mathe_note} - Das ist gut!") else: print(f"Mathe-Note: {mathe_note} - Da geht noch was!") print(f"Hobbys: {', '.join(daten[5])}") print(f"Motto: \"{daten[6]}\"") print("=" * 30) # Programm ausführen zeige_steckbrief(steckbrief)
4. Flask-Abschlussaufgabe (Bonus)
Wenn du bereits Flask – 01 Erste Schritte, Flask – 02 Jinja Templating Grundlagen, Flask – 03 Jinja Schleifen und Listen und Flask – 04 Formulare und Datenverarbeitung durchgearbeitet hast, kannst du dein Steckbrief-Programm in eine vollwertige Web-Anwendung verwandeln!
Bonus: Steckbrief als Web-App
Erstelle eine Flask-Anwendung, die Steckbriefe erstellt und anzeigt.
Anforderungen:
Route
/steckbrief(GET): Zeigt ein Formular mit folgenden Feldern:- Vorname, Nachname, Alter
- Lieblingsfach
- Mag Mathe? (Checkbox)
- Hobbys (Textarea, komma-getrennt)
- Motto
Route
/steckbrief(POST):- Empfängt die Formulardaten
- Validiert die Eingaben (nutze Funktionen!)
- Zeigt den Steckbrief formatiert an
Nutze deine Python-Funktionen:
berechne_geburtsjahr(alter)- Mindestens eine Validierungs-Funktion
Template-Features:
- Nutze
{% if %}für bedingte Ausgaben - Nutze
{% for %}für die Hobby-Liste - Nutze Template-Vererbung mit
base.html
- Nutze
Erweiterungen (optional):
- Speichere mehrere Steckbriefe in einer Liste
- Erstelle eine Übersichtsseite
/alle-steckbriefe - Füge CSS-Styling hinzu
Beispiel-Lösung zeigen
app.py:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79from flask import Flask, render_template, request app = Flask(__name__) # Liste zum Speichern der Steckbriefe (wird bei Neustart gelöscht) steckbriefe_liste = [] # Hilfsfunktionen (aus Python 09) def berechne_geburtsjahr(alter: int) -> int: """Berechnet das ungefähre Geburtsjahr.""" return 2025 - alter def validiere_alter(alter_str: str) -> bool: """Prüft, ob das Alter gültig ist.""" try: alter = int(alter_str) return 10 <= alter <= 100 except: return False @app.route("/") def home(): return render_template("home.html") @app.route("/steckbrief", methods=['GET', 'POST']) def steckbrief(): if request.method == 'POST': # Daten aus Formular holen vorname = request.form.get('vorname') nachname = request.form.get('nachname') alter_str = request.form.get('alter') lieblingsfach = request.form.get('lieblingsfach') mag_mathe = request.form.get('mag_mathe') == 'on' hobbys_str = request.form.get('hobbys') motto = request.form.get('motto') # Validierung fehler = [] if not vorname or not nachname: fehler.append("Vor- und Nachname müssen ausgefüllt sein") if not validiere_alter(alter_str): fehler.append("Alter muss zwischen 10 und 100 sein") if fehler: return render_template("steckbrief_formular.html", fehler=fehler) # Daten verarbeiten alter = int(alter_str) hobbys = [h.strip() for h in hobbys_str.split(',')] geburtsjahr = berechne_geburtsjahr(alter) # Steckbrief-Dictionary erstellen steckbrief_daten = { 'vorname': vorname, 'nachname': nachname, 'alter': alter, 'geburtsjahr': geburtsjahr, 'lieblingsfach': lieblingsfach, 'mag_mathe': mag_mathe, 'hobbys': hobbys, 'motto': motto } # In Liste speichern steckbriefe_liste.append(steckbrief_daten) return render_template("steckbrief_anzeige.html", steckbrief=steckbrief_daten) # GET-Request: Formular anzeigen return render_template("steckbrief_formular.html") @app.route("/alle-steckbriefe") def alle_steckbriefe(): return render_template("alle_steckbriefe.html", steckbriefe=steckbriefe_liste) if __name__ == "__main__": app.run(debug=True)templates/base.html:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57<!DOCTYPE html> <html lang="de"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>{% block title %}Steckbrief-App{% endblock %}</title> <style> body { font-family: Arial, sans-serif; max-width: 800px; margin: 50px auto; padding: 20px; background-color: #f5f5f5; } .container { background: white; padding: 30px; border-radius: 10px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); } h1 { color: #333; } .fehler { background: #ffebee; color: #c62828; padding: 10px; border-radius: 5px; margin-bottom: 20px; } input, textarea, select { width: 100%; padding: 8px; margin: 5px 0 15px 0; border: 1px solid #ddd; border-radius: 4px; } button { background: #1976d2; color: white; padding: 10px 20px; border: none; border-radius: 4px; cursor: pointer; } button:hover { background: #1565c0; } .steckbrief { border-left: 4px solid #1976d2; padding-left: 20px; margin: 20px 0; } </style> </head> <body> <div class="container"> {% block content %}{% endblock %} </div> </body> </html>templates/steckbrief_formular.html:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47{% extends "base.html" %} {% block title %}Steckbrief erstellen{% endblock %} {% block content %} <h1>Steckbrief erstellen</h1> {% if fehler %} <div class="fehler"> <strong>Fehler:</strong> <ul> {% for fehler_text in fehler %} <li>{{ fehler_text }}</li> {% endfor %} </ul> </div> {% endif %} <form method="POST"> <label>Vorname:</label> <input type="text" name="vorname" required> <label>Nachname:</label> <input type="text" name="nachname" required> <label>Alter:</label> <input type="number" name="alter" min="10" max="100" required> <label>Lieblingsfach:</label> <input type="text" name="lieblingsfach" required> <label> <input type="checkbox" name="mag_mathe"> Mag Mathe </label> <label>Hobbys (komma-getrennt):</label> <textarea name="hobbys" rows="3" required></textarea> <label>Motto:</label> <input type="text" name="motto" required> <button type="submit">Steckbrief erstellen</button> </form> <p><a href="/alle-steckbriefe">Alle Steckbriefe anzeigen</a></p> {% endblock %}templates/steckbrief_anzeige.html:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33{% extends "base.html" %} {% block title %}Steckbrief von {{ steckbrief.vorname }}{% endblock %} {% block content %} <h1>Steckbrief</h1> <div class="steckbrief"> <h2>{{ steckbrief.vorname }} {{ steckbrief.nachname }}</h2> <p><strong>Alter:</strong> {{ steckbrief.alter }} (geboren ca. {{ steckbrief.geburtsjahr }})</p> <p><strong>Lieblingsfach:</strong> {{ steckbrief.lieblingsfach }}</p> {% if steckbrief.mag_mathe %} <p><strong>Mag Mathe:</strong> Ja ✓</p> {% else %} <p><strong>Mag Mathe:</strong> Nein</p> {% endif %} <p><strong>Hobbys:</strong></p> <ul> {% for hobby in steckbrief.hobbys %} <li>{{ hobby }}</li> {% endfor %} </ul> <p><strong>Motto:</strong> "{{ steckbrief.motto }}"</p> </div> <p> <a href="/steckbrief">Neuen Steckbrief erstellen</a> | <a href="/alle-steckbriefe">Alle Steckbriefe anzeigen</a> </p> {% endblock %}templates/alle_steckbriefe.html:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20{% extends "base.html" %} {% block title %}Alle Steckbriefe{% endblock %} {% block content %} <h1>Alle Steckbriefe</h1> {% if steckbriefe %} {% for sb in steckbriefe %} <div class="steckbrief"> <h3>{{ sb.vorname }} {{ sb.nachname }}</h3> <p>{{ sb.alter }} Jahre | {{ sb.lieblingsfach }}</p> </div> {% endfor %} {% else %} <p>Noch keine Steckbriefe vorhanden.</p> {% endif %} <p><a href="/steckbrief">Neuen Steckbrief erstellen</a></p> {% endblock %}
Zusammenfassung
Glückwunsch! Du hast alle Python-Grundlagen durchgearbeitet. Du kannst jetzt:
✅ Datentypen gezielt einsetzen (Strings, Zahlen, Booleans, Listen) ✅ Kontrollstrukturen nutzen (if-else, for, while) ✅ Funktionen schreiben (mit Parametern und Rückgabewerten) ✅ Algorithmen entwickeln (Probleme in Schritte zerlegen) ✅ Programme strukturieren (Code organisieren und kommentieren)
Wie geht es weiter?
Je nachdem, was dich interessiert:
Flask-Kurs fortsetzen
- Lerne, wie du deine Python-Programme als Webseiten präsentierst
- Arbeite mit Formularen, Templates und Datenbanken
Python vertiefen:
- Datei-Operationen (Dateien lesen/schreiben)
- Arbeiten mit Bibliotheken (requests, pandas, matplotlib)
- Objektorientierte Programmierung (Klassen und Objekte)
Eigene Projekte:
- Rechner-App
- Quiz-Spiel
- Notenrechner
- Text-Analyse-Tool
Tipp für den Erfolg
Der beste Weg zu lernen ist: Selbst Code schreiben! Nimm dir kleine Projekte vor und setze sie um. Fehler machen ist dabei völlig normal und wichtig für den Lernprozess.
Viel Erfolg auf deinem weiteren Programmier-Weg!