Python – 05 For-Schleifen

Python – 05 For-Schleifen

Voraussetzungen

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

Grundgerüst

Mit dem folgenden Code wird eine Schleife durchlaufen. Der Vorgang, der in dem Anweisungsblock steht wird so oft wie die Zahl in der Funktion range() wiederholt.

1
2
for i in range(5):
    print('Dieser Text wiederholt sich 5 mal!')

So kannst du den Code auch etwas flexibler gestalten, in dem du den Wert der Variablen n festlegst und übergibst:

1
2
3
4
n = 10

for i in range(n):
    print('Dieser Text wiederholt sich',n,'mal!')

In Python kannst du for-Schleifen auch durch Listen oder Strings durchlaufen lassen:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#Quelle: https://www.w3schools.com/python/python_for_loops.asp

#Schleife durchläuft Elemente einer Liste
fruits = ["apple", "banana", "cherry"]
for x in fruits:
  print(x)

#Schleife durchläuft Character eines Strings
for x in "banana":
  print(x)

Aufgabe 1: Erste Schritte mit for-Schleifen

  1. Probiere die Beispielcodes oben aus. Erhältst du die erwartete Ausgabe? Nein? Ändere Parameter, um den Code besser zu verstehen.
  2. Schreibe einen Code, der n mal (der Wert von n soll im Code festgelegt werden) den folgenden Text ausgibt: “Du sollst nicht durch 0 teilen!” (a)

Aufgabe 2: range() verstehen

Analysiere diesen Code und beantworte anschließend die Fragen:

1
2
for x in range(4, 9):
  print(x)

Analysiere diesen Code und beantworte anschließend die Fragen:

1
2
for x in range(12, 40, 3):
  print(x)

Aufgabe 3: Mathematische Berechnungen

  1. Erstelle einen Code zur Berechnung der Summe aller Zahlen von 0 bis 100 (“kleiner Gauß”). Nutze dafür eine for-Schleife. (a)
  2. Erstelle einen Code zur Berechnung der Fakultät von 100. Nutze dafür eine for-Schleife. (a)

Aufgabe 4: Verschachtelte Schleifen

Analysiere die folgenden Code-Blöcke und beantworte dann die Fragen.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#Beispiel 1 mit Zahlen
for i in range(5):
    for j in range(4):
        sum = i+j
        print(i," + ",j, " = ", sum)

#Beispiel 2 mit zusammengesetzten Worten aus Listen
adj = ["schlaue", "gelbe", "kleine"]
namen = ["Ente", "Layla", "Banane"]

for x in adj:
  for y in namen:
    print(x, y)
  1. Analysiere. Analysiere bedeutet, dass du dir den Code Zeile für Zeile ansiehst, dahinter schreibst, was passiert und ein mal erklärst, was insgesamt passiert. Dazu musst du den Code natürlich kopieren und in eine eigene Datei schreiben. (a)
  2. Beantworte die Fragen unten. Wenn du unsicher bist, schau dir Tipps darunter an.
Tipps zu den Fragen

Zu der Zählfrage:

1
2
3
4
5
6
num = 0 #Dieser Wert soll gleich in der doppelten Schleife die Nr. des Wertes mitzählen
for i in range(3):
    for j in range(4):
        sum = i+j
        num += 1 #Zähler wird mit jedem Gesamtdurchlauf um 1 erhöht
        print("Nr. ",num,": ", i," + ",j, " = ", sum)

Aufgabe 5 (extra): Geheimbotschaften

Mit for-Loops geht so einiges mehr! Hier ein kleiner Einblick für dich, falls du so schnell so weit gekommen bist.

Wir schreiben simple Geheimbotschaften, indem wir jeden x-ten Buchstaben auslassen.

Schreibe ein Skript, welches ein Wort in seine Buchstaben aufteilt und in eine Liste übergibt. Gib anschließend jeden zweiten (dritten, vierten) Buchstaben aus. (Du darfst den Text auch ohne Leerzeichen schreiben, das macht das Entschlüsseln einfacher.)

Tipp:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
#Tipp Teil 1
text = "Das ist mein Text." #ein Text
liste = list(text) #Text wird als Liste gespeichert. Dabei wird jeder Character, auch Leerzeichen als Listenelement gespeichert

print(liste[0]) #gibt also den 1. Character des Textes text aus
print(liste[6]) #gibt also den 7. Character des Textes text aus

#Tipp Teil 2 # gibt den Text als Liste von Buchstaben aus
for buchstabe in liste: # hiermit werden alle Buchstaben ausgegeben, wie kann man mit if-Abfragen erreichen, dass nur bei jedem 2 zweiten Buchstaben etwas ausgegeben wird?
    print(buchstabe)


# Ein anderer Ansatz
for index, x in enumerate(text):
    if index % 2 == 0:
        print(x)
    else:
        print("-")

Erstelle einen Geheimtext oder lasse ihn durch einen Nutzer eingeben. Überlege dir selbst eine Rechenregel für den Index, um die Geheimbotschaft auszugeben. Viel Spaß!


Flask-Anwendung (Bonus)

Voraussetzung für diese Aufgabe

Du solltest bereits Flask – 01 Erste Schritte und Flask – 02 Jinja Templating Grundlagen durchgearbeitet haben. Wenn nicht, überspringe diese Bonus-Aufgabe zunächst.

Bonus: Geheimbotschaft-Entschlüssler

Erstelle eine Web-App, die Geheimbotschaften entschlüsselt (wie in Aufgabe 5)!

Anforderungen:

  1. Erstelle eine Route /geheimbotschaft mit GET und POST
  2. Zeige ein Formular, wo der Benutzer:
    • Einen verschlüsselten Text eingeben kann
    • Die Schrittweite wählen kann (jeder 2., 3., 4. Buchstabe)
  3. Nach dem Absenden:
    • Nutze eine for-Schleife in Python, um die Botschaft zu entschlüsseln
    • Zeige sowohl den Originaltext als auch die entschlüsselte Botschaft an

Bonuspunkte:

  • Zeige die Botschaft Zeichen für Zeichen mit Index-Nummern
  • Füge eine “Verschlüsseln”-Funktion hinzu (umgekehrter Prozess)
  • Nutze verschiedene Farben für verschlüsselte/entschlüsselte Zeichen
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
from flask import Flask, render_template, request

app = Flask(__name__)

def entschluessle(text: str, schritt: int) -> str:
    """Entschlüsselt einen Text, indem nur jeder n-te Buchstabe genommen wird."""
    entschluesselt = ""

    for index, zeichen in enumerate(text):
        if index % schritt == 0:
            entschluesselt += zeichen

    return entschluesselt

def verschluessle(text: str, schritt: int) -> str:
    """Verschlüsselt einen Text, indem zwischen die Buchstaben Füllzeichen eingefügt werden."""
    verschluesselt = ""

    for index, zeichen in enumerate(text):
        verschluesselt += zeichen
        # Füge (schritt-1) Füllzeichen ein
        if index < len(text) - 1:  # Nicht nach dem letzten Zeichen
            for _ in range(schritt - 1):
                verschluesselt += "x"

    return verschluesselt

@app.route("/")
def home():
    return render_template("home.html")

@app.route("/geheimbotschaft", methods=['GET', 'POST'])
def geheimbotschaft():
    if request.method == 'POST':
        text = request.form.get('text')
        schritt = int(request.form.get('schritt', 2))
        aktion = request.form.get('aktion')

        if aktion == 'entschluesseln':
            ergebnis = entschluessle(text, schritt)
            aktion_text = "Entschlüsselte Botschaft"
        else:
            ergebnis = verschluessle(text, schritt)
            aktion_text = "Verschlüsselte Botschaft"

        # Erstelle Details für Zeichen-für-Zeichen Anzeige
        details = []
        for index, zeichen in enumerate(text):
            verwendet = (index % schritt == 0) if aktion == 'entschluesseln' else True
            details.append({
                'index': index,
                'zeichen': zeichen,
                'verwendet': verwendet
            })

        return render_template("geheimbotschaft_ergebnis.html",
                               original=text,
                               ergebnis=ergebnis,
                               schritt=schritt,
                               aktion_text=aktion_text,
                               details=details)

    # GET-Request: Formular anzeigen
    return render_template("geheimbotschaft_formular.html")

if __name__ == "__main__":
    app.run(debug=True)

templates/geheimbotschaft_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
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
80
81
82
83
84
85
86
87
<!DOCTYPE html>
<html lang="de">
<head>
    <meta charset="UTF-8">
    <title>Geheimbotschaft</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            max-width: 600px;
            margin: 50px auto;
            padding: 20px;
            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
        }
        .container {
            background: white;
            padding: 30px;
            border-radius: 10px;
            box-shadow: 0 10px 30px rgba(0,0,0,0.3);
        }
        h1 {
            color: #667eea;
            text-align: center;
        }
        label {
            display: block;
            margin-top: 15px;
            font-weight: bold;
            color: #333;
        }
        input, textarea, select {
            width: 100%;
            padding: 10px;
            margin-top: 5px;
            border: 2px solid #ddd;
            border-radius: 5px;
            font-size: 16px;
        }
        button {
            width: 48%;
            padding: 12px;
            margin-top: 20px;
            border: none;
            border-radius: 5px;
            font-size: 16px;
            cursor: pointer;
            font-weight: bold;
        }
        .btn-entschluesseln {
            background: #667eea;
            color: white;
        }
        .btn-verschluesseln {
            background: #764ba2;
            color: white;
            margin-left: 4%;
        }
        button:hover {
            opacity: 0.9;
        }
    </style>
</head>
<body>
    <div class="container">
        <h1>Geheimbotschaft</h1>

        <form method="POST">
            <label>Deine Botschaft:</label>
            <textarea name="text" rows="4" required placeholder="Gib hier deinen Text ein..."></textarea>

            <label>Schrittweite:</label>
            <select name="schritt">
                <option value="2">Jeder 2. Buchstabe</option>
                <option value="3">Jeder 3. Buchstabe</option>
                <option value="4">Jeder 4. Buchstabe</option>
                <option value="5">Jeder 5. Buchstabe</option>
            </select>

            <button type="submit" name="aktion" value="entschluesseln" class="btn-entschluesseln">
                Entschlüsseln
            </button>
            <button type="submit" name="aktion" value="verschluesseln" class="btn-verschluesseln">
                Verschlüsseln
            </button>
        </form>
    </div>
</body>
</html>

templates/geheimbotschaft_ergebnis.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
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
<!DOCTYPE html>
<html lang="de">
<head>
    <meta charset="UTF-8">
    <title>Ergebnis - Geheimbotschaft</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            max-width: 800px;
            margin: 50px auto;
            padding: 20px;
            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
        }
        .container {
            background: white;
            padding: 30px;
            border-radius: 10px;
            box-shadow: 0 10px 30px rgba(0,0,0,0.3);
        }
        h1 {
            color: #667eea;
            text-align: center;
        }
        .box {
            background: #f5f5f5;
            padding: 20px;
            border-radius: 5px;
            margin: 20px 0;
        }
        .box h3 {
            margin-top: 0;
            color: #555;
        }
        .ergebnis {
            font-size: 1.2em;
            font-weight: bold;
            color: #667eea;
        }
        .details {
            display: flex;
            flex-wrap: wrap;
            gap: 5px;
            margin-top: 15px;
        }
        .zeichen {
            padding: 8px 12px;
            border-radius: 4px;
            font-family: monospace;
            font-size: 14px;
        }
        .verwendet {
            background: #667eea;
            color: white;
            font-weight: bold;
        }
        .nicht-verwendet {
            background: #e0e0e0;
            color: #999;
        }
        .info {
            background: #e3f2fd;
            padding: 10px;
            border-left: 4px solid #2196f3;
            margin: 20px 0;
        }
        a {
            display: inline-block;
            margin-top: 20px;
            padding: 10px 20px;
            background: #667eea;
            color: white;
            text-decoration: none;
            border-radius: 5px;
        }
        a:hover {
            opacity: 0.9;
        }
    </style>
</head>
<body>
    <div class="container">
        <h1>{{ aktion_text }}</h1>

        <div class="box">
            <h3>Original-Text:</h3>
            <p>{{ original }}</p>
        </div>

        <div class="info">
            <strong>Methode:</strong> Jeder {{ schritt }}. Buchstabe
        </div>

        <div class="box">
            <h3>{{ aktion_text }}:</h3>
            <p class="ergebnis">{{ ergebnis }}</p>
        </div>

        <div class="box">
            <h3>Zeichen für Zeichen:</h3>
            <div class="details">
                {% for detail in details %}
                    <div class="zeichen {% if detail.verwendet %}verwendet{% else %}nicht-verwendet{% endif %}">
                        <small>{{ detail.index }}</small><br>
                        {{ detail.zeichen }}
                    </div>
                {% endfor %}
            </div>
            <p><small><em>Grün = verwendet | Grau = übersprungen</em></small></p>
        </div>

        <a href="/geheimbotschaft">← Zurück</a>
    </div>
</body>
</html>

Beispiel-Nutzung:

  • Verschlüsseln: Text “HALLO” mit Schrittweite 2 → “HxAxLxLxO”
  • Entschlüsseln: Text “HxAxLxLxO” mit Schrittweite 2 → “HALLO”
Zuletzt aktualisiert am