Python – 09 Algorithmen und Abschlussübung

Python – 09 Algorithmen und Abschlussübung

Voraussetzungen

Bevor du mit diesem Modul startest, solltest du bereits vertraut sein mit:

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

  1. Eindeutigkeit: Jeder Schritt ist klar definiert
  2. Endlichkeit: Der Algorithmus endet nach endlich vielen Schritten
  3. Effizienz: Möglichst wenig Ressourcen (Zeit, Speicher)
  4. 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ück

Python-Implementierung:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
def finde_maximum(zahlen: list[int]) -> int:
    """Findet die größte Zahl in einer Liste."""
    maximum = zahlen[0]

    for zahl in zahlen:
        if zahl > maximum:
            maximum = zahl

    return maximum

# Test
meine_zahlen = [23, 5, 89, 12, 67, 3]
print(finde_maximum(meine_zahlen))  # Ausgabe: 89

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 return zurück

Testfall:

1
print(berechne_summe([1, 2, 3, 4, 5]))  # Soll 15 ausgeben
Lösung zeigen
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
def 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:

1
print(berechne_durchschnitt([10, 20, 30]))  # Soll 20.0 ausgeben
Lösung zeigen
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
def 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:

1
print(filtere_gerade([1, 2, 3, 4, 5, 6]))  # Soll [2, 4, 6] ausgeben
Lösung zeigen
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
def 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:

1
2
3
print(validiere_passwort("Hallo123"))   # True
print(validiere_passwort("hallo"))      # False (zu kurz, keine Zahl, kein Großbuchstabe)
print(validiere_passwort("Hallo"))      # False (keine Zahl)
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
def 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: True

Alternative elegantere Lösung:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
def 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

  1. Lege folgende Variablen an (nutze type hints, siehe Python – 08 Type Hints):

    • vorname: str
    • nachname: str
    • alter: int
    • mag_mathe: bool
    • lieblingsfach: str
    • hobbys: list[str] (mindestens 3 Einträge)
    • motto: str
    • note_mathe: float
  2. 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 aus
  • berechne_geburtsjahr(alter) – Berechnet das ungefähre Geburtsjahr
  • ist_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:

  1. Route /steckbrief (GET): Zeigt ein Formular mit folgenden Feldern:

    • Vorname, Nachname, Alter
    • Lieblingsfach
    • Mag Mathe? (Checkbox)
    • Hobbys (Textarea, komma-getrennt)
    • Motto
  2. Route /steckbrief (POST):

    • Empfängt die Formulardaten
    • Validiert die Eingaben (nutze Funktionen!)
    • Zeigt den Steckbrief formatiert an
  3. Nutze deine Python-Funktionen:

    • berechne_geburtsjahr(alter)
    • Mindestens eine Validierungs-Funktion
  4. Template-Features:

    • Nutze {% if %} für bedingte Ausgaben
    • Nutze {% for %} für die Hobby-Liste
    • Nutze Template-Vererbung mit base.html

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
79
from 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:

  1. Flask-Kurs fortsetzen

    • Lerne, wie du deine Python-Programme als Webseiten präsentierst
    • Arbeite mit Formularen, Templates und Datenbanken
  2. Python vertiefen:

    • Datei-Operationen (Dateien lesen/schreiben)
    • Arbeiten mit Bibliotheken (requests, pandas, matplotlib)
    • Objektorientierte Programmierung (Klassen und Objekte)
  3. 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!

Zuletzt aktualisiert am