anfängerproblem - bitte um hilfe

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
OhnePlan
User
Beiträge: 2
Registriert: Sonntag 27. August 2023, 13:24

Hallo Liebe community,

ich bin neu in der welt der programmierung, und versuche mich gerade an einem kleinen python script.
Ich habe im folgenden script das Problem, dass wenn ich noch einen versuch habe und das Passwort richtig eingebe trotzdem die meldung kommt, dass ich keine versuche mehr habe. was laut code auch völlig logisch ist:
passwort_try bekommt den wert 0, die schleife fängt oben wieder an und somit stimmt die bedingung. wie löse ich dieses kleine problem?

konstruktive kritik ist gerne gesehen.

Code: Alles auswählen

password = "pass"
username = ""
user_input = ""
password_try = 3

username = input("Bitte Usernamen eingeben: ")
user_input = input("Willkommen " + username + ". Bitte Passwort eingeben: ")

while True:

    if password_try == 0:
        print("Keine versuche mehr! Programm wird beendet!")
        exit()
    if user_input != password:
        user_input = input("Falsches Passwort. Noch " + str(password_try) + " Versuche: ")
        password_try -= 1
        continue
    else:
        print(username + " erfolgreich eingeloggt!")
        break

print("Hier gehts dann weiter...")
vielen dank
ohneplan
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du hast keinen Versuch mehr, weil du die Ausgabe machst, *bevor* du die Anzahl der Versuche anpasst. Also sagst du "noch 1 Versuch", aber danach reduzierst du auf 0, und es geht von vorne los. Womit die erste Bedingung zutrifft, und das Programm abbricht.

Du musst also *vor* der Ausgabe der Anzahl der Versuche dekrementieren. Und dann kannst du eigentlich genau an der Stelle schon pruefen, ob noch welche da sind, oder das Programm beenden. Sonst gibst du "noch 0 versuche" aus, was ja unnoetig ist.
Benutzeravatar
__blackjack__
User
Beiträge: 14053
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@OhnePlan: Die ersten Zuweisungen von leeren Zeichenketten an `username` und `user_input` sind sinnlos, weil diese Werte nirgends verwendet werden. Man definiert nicht alle Namen am Anfang und belegt welche mit irgendwelchen Dummy-Werten.

Werte und Zeichenketten mit ``+`` und `str()` zusammenstückeln ist eher BASIC als Python. In Python gibt es Zeichenkettenformatierung mit der `format()`-Methode auf Zeichenketten und f-Zeichenkettenliterale.

Der Test ob noch Versuche übrig sind, wäre eine sinnvolle Bedingung für die ``while``-Schleife, und die Information, dass keine mehr da sind, könnte man in den ``else``-Zweig verschieben.

``continue`` sollte man vermeiden wo man kann, und das kann man fast immer. Insbesondere in diesem Fall wo das überhaupt keinen Unterschied macht ob das da nun steht oder nicht, weil da sowieso als nächstes die Schleife erneut durchlaufen wird.

`exit()` gibt es eigentlich gar nicht wenn man das nicht aus `sys` importiert. Aber das sollte man nicht verwenden wenn man nicht mindestens potentiell einen anderen Rückgabecode als 0 an den Aufrufer des Programms liefern möchte. An der Stelle könnte man auch einfach die Hauptfunktion durch ``return`` beenden.

Ungetestet:

Code: Alles auswählen

#!/usr/bin/env python3


def main():
    password = "pass"
    password_try = 3
    username = input("Bitte Usernamen eingeben: ")
    user_input = input(f"Willkommen {username}. Bitte Passwort eingeben: ")

    while password_try:
        password_try -= 1

        if user_input == password:
            break

        user_input = input(
            f"Falsches Passwort. Noch {password_try} Versuche: "
        )
    else:
        print("Keine Versuche mehr! Programm wird beendet!")
        return

    print(f"{username} erfolgreich eingeloggt!")
    print("Hier gehts dann weiter...")


if __name__ == "__main__":
    main()
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Sirius3
User
Beiträge: 18273
Registriert: Sonntag 21. Oktober 2012, 17:20

exit ohne Argument kommt in einem sauberen Programm nicht vor. Das Programm endet, wenn die Main-Funktion verlassen wird. Strings werden nicht mit + zusammengestückelt, sondern man benutzt f-Strings.
continue sollte man vermeiden, ist hier auch gar nicht nötig.
username und user_input werden mit dem leeren String belegt, aber nie benutzt. In Python muss man keine Variablen deklarieren. Sowas ähnliches zu imitieren ist Unsinn.
user_input ist ein sehr generischer Name für ein Passwort.

Code: Alles auswählen

PASSWORD = "pass"
def main():
    password_try = 3
    username = input("Bitte Usernamen eingeben: ")
    password = input(f"Willkommen {username}. Bitte Passwort eingeben: ")
    while password != PASSWORD:
        password_try -= 1
        if password_try == 0:
            print("Keine versuche mehr! Programm wird beendet!")
            return
        password = input(f"Falsches Passwort. Noch {password_try}) Versuche: ")
    print("Hier gehts dann weiter...")

if __name__ == "__main__":
    main()
OhnePlan
User
Beiträge: 2
Registriert: Sonntag 27. August 2023, 13:24

Vielen dank für eure hilfe. ich arbeite mich durch ein buch und da gehts eben gerade um while und if-else verzweigungen. deswegen diese kleine eigene übung. bei den funktionen (def) bin ich noch gar nicht, deswegen ist das zwar lieb gemeint, bringt mich aber hier nicht wirklich weiter, da mir basis wissen fehlt. und auch das mit dem "F" sagt mir nichts
ich hab das ganze nun so gelöst:

Code: Alles auswählen

password = "pass"
password_try = 4

username = input("Bitte Usernamen eingeben: ")
user_input = input("Willkommen " + username + ". Bitte Passwort eingeben: ")

while password_try > 0:
    if user_input != password:
        password_try -= 1
        if password_try == 0:
            print("Keine Versuche mehr! Programm wird beendet.")
            exit()
        else:
            user_input = input("Falsches Passwort. Noch " + str(password_try) + " Versuche: ")
    else:
        print(username + " erfolgreich eingeloggt!")
        break
        
print()
print("Hier gehts dann weiter...")
wie beende ich den dann das Programm, wenn passwort_try 0 ist, wenn ich das nicht mit exit mache? return hilft mir da ja nicht
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ein Weg waere hier continue statt exit, denn dann passt deine while-Bedingung ja auch nicht mehr. Und danach passiert ja nicht wirklich was. Wenn du eine Flagge fuer erfolgreichen Login setzt, und die dann unten abfragst, kannst du auch sicherstellen, dass der Rest nur passiert, wenn man eingeloggt ist.

Aber Funktionen sollten schon recht bald mal benutzt werden.
Antworten