Seite 1 von 1

anfängerproblem - bitte um hilfe

Verfasst: Sonntag 27. August 2023, 13:41
von OhnePlan
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

Re: anfängerproblem - bitte um hilfe

Verfasst: Sonntag 27. August 2023, 14:02
von __deets__
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.

Re: anfängerproblem - bitte um hilfe

Verfasst: Sonntag 27. August 2023, 14:46
von __blackjack__
@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()

Re: anfängerproblem - bitte um hilfe

Verfasst: Sonntag 27. August 2023, 14:48
von Sirius3
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()

Re: anfängerproblem - bitte um hilfe

Verfasst: Sonntag 27. August 2023, 15:11
von OhnePlan
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

Re: anfängerproblem - bitte um hilfe

Verfasst: Sonntag 27. August 2023, 15:52
von __deets__
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.