Anfängerproblem: Kann eine Schleife mehrere (geordnete) Variablen ausgeben?

Code-Stücke können hier veröffentlicht werden.
Antworten
EFFiZ
User
Beiträge: 6
Registriert: Mittwoch 12. Februar 2020, 10:08

Liebes Forum,

Suchmaschinen, das Durchforsten des Forums und klassisches Nachschlagen im Lehrbuch haben mir keinen Erfolg gebracht.

In Theis "Einstieg in Python" ist ein kleines Programm zur Verschlüsselung eines Strings, das ich etwas angepasst habe:

Code: Alles auswählen


for z in "Geheim":
    t = chr(ord(z)+1)
    print(t, end="")

Die Ausgabe lautet: Hfifjn

Verschlüsselung bringt ja nur etwas, wenn man sie rückgängig machen kann. Entschlüsseln könnte man wie folgt:

Code: Alles auswählen


for x in "Hfifjn":
    y = chr(ord(x)-1)
    print(y, end="")

Beim Rumprobieren, bin ich auf ein Problem gestoßen. Ich würde es nämlich gerne auch so hinbekommen:

Code: Alles auswählen


for x in t:             
    y = chr(ord(x)-1)
    print(y, end="")

Das Problem ist, dass t nur "n" ist. Der letzte Durchlauf der ersten for-Schleife legt t = "n" fest.

Ist es möglich, die erste Schleife so zu schreiben, dass man die einzelnen Strings später zu einem großen String verknüpfen kann? Die Ausgabe müsste wie folgt aussehen:

t01 = "H"
t02 = "f"
t03 = "i"
usw.

Alternativ würde auch t = "Hfifjn" passen, aber der Nutzen von Variante 1 für spätere Projekte ist sicherlich größer.

Vielen Dank!
I.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Funktionen sollten immer nur eine Aufgabe haben, eine Funktion die einen String verschlüsselt und eine andere, die einen String ausgibt. Du hast noch gar keine Funktionen und mischst dazu noch die beiden Aufgaben. Das ist also auf maximale Nicht-Weiterverwendung optimiert.

Was Du brauchst ist eine Liste, die mit den einzelnen verschlüsselten Buchstaben gefüllt wird (statt Variablen mit Nummern zu versehen). Aus der Liste kann man dann bei Bedarf auch wieder einen String machen.
Dazu solltest Du Dir gleich angewöhnen verständliche Variablennamen zu verwenden. `t` für einen verschluesselten_text ist nicht sehr aussagekräftig. `x` für ein verschluesstes_zeichen oder `y` für ein entschluesseltes_zeichen ebensowenig.
EFFiZ
User
Beiträge: 6
Registriert: Mittwoch 12. Februar 2020, 10:08

Das mit der Liste füllen ist smart. Ärglich, da hätte man auch selber draufkommen können!
Danke!
EFFiZ
User
Beiträge: 6
Registriert: Mittwoch 12. Februar 2020, 10:08

Falls jemanden die Lösung interessiert:

Code: Alles auswählen


verschluesselung = []

for zeichen in "Geheim":
    geheimes_zeichen = chr(ord(zeichen)+1)
    verschluesselung.append(geheimes_zeichen)
print()

print(verschluesselung)

for geheimes_zeichen in verschluesselung:             
    zeichen = chr(ord(geheimes_zeichen)-1)
    print(zeichen, end="")

Benutzeravatar
__blackjack__
User
Beiträge: 13112
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@EFFiZ: `verschluesselung` ist nicht so ganz passend, das wäre eher `verschluesselter_text`. Und wirklich ”geheim” ist `geheimes_zeichen` ja auch nicht wenn man das letztlich über `print()` ausgibt.

Es würde sich hier eine „list comprehension“ anbieten.

Code: Alles auswählen

    verschluesselter_text = [chr(ord(zeichen) + 1) for zeichen in "Geheim"]
    print(verschluesselter_text)
Und man sollte da vielleicht auch wieder eine Zeichenkette heraus bekommen:

Code: Alles auswählen

    verschluesselter_text = "".join(
        chr(ord(zeichen) + 1) for zeichen in "Geheim"
    )
    print(verschluesselter_text)
Statt beim entschlüsseln dann jedes entschlüsselte Zeichen gleich auszugeben könnte man auch dort erst eine entschlüsselte Zeichenkette erstellen:

Code: Alles auswählen

    verschluesselter_text = "".join(
        chr(ord(zeichen) + 1) for zeichen in "Geheim"
    )
    print(verschluesselter_text)

    entschluesselter_text = "".join(
        chr(ord(zeichen) - 1) for zeichen in verschluesselter_text
    )
    print(entschluesselter_text)
Hier sieht man jetzt das ver- und entschlüsseln fast gleich sind und sich im Grunde nur an einer Stelle unterscheiden. Das schreit förmlich danach das in eine Funktion heraus zu ziehen.

Code: Alles auswählen

#!/usr/bin/env python3


def code(text, offset):
    return "".join(chr(ord(zeichen) + offset) for zeichen in text)
    

def main():
    verschluesselter_text = code("Geheim", 1)
    print(verschluesselter_text)

    entschluesselter_text = code(verschluesselter_text, -1)
    print(entschluesselter_text)


if __name__ == "__main__":
    main()
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
EFFiZ
User
Beiträge: 6
Registriert: Mittwoch 12. Februar 2020, 10:08

@ blackjack: Danke für den Nachtrag. Ich werde es mir mal genauer anschauen, was Du da gemacht hast.
Antworten