Python – 05 For-Schleifen
Voraussetzungen
Bevor du mit diesem Modul startest, solltest du bereits vertraut sein mit:
- Python – 04 Listen - Listen und ihre Operationen
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.
| |
So kannst du den Code auch etwas flexibler gestalten, in dem du den Wert der Variablen n festlegst und übergibst:
| |
In Python kannst du for-Schleifen auch durch Listen oder Strings durchlaufen lassen:
| |
Aufgabe 1: Erste Schritte mit for-Schleifen
- Probiere die Beispielcodes oben aus. Erhältst du die erwartete Ausgabe? Nein? Ändere Parameter, um den Code besser zu verstehen.
- 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:
| |
Analysiere diesen Code und beantworte anschließend die Fragen:
| |
Aufgabe 3: Mathematische Berechnungen
- Erstelle einen Code zur Berechnung der Summe aller Zahlen von 0 bis 100 (“kleiner Gauß”). Nutze dafür eine for-Schleife. (a)
- 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.
| |
- 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)
- Beantworte die Fragen unten. Wenn du unsicher bist, schau dir Tipps darunter an.
Tipps zu den Fragen
Zu der Zählfrage:
| |
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:
| |
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:
- Erstelle eine Route
/geheimbotschaftmit GET und POST - Zeige ein Formular, wo der Benutzer:
- Einen verschlüsselten Text eingeben kann
- Die Schrittweite wählen kann (jeder 2., 3., 4. Buchstabe)
- 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 67from 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”