Seite 1 von 1

Globale und Lokale Variablen Problem

Verfasst: Mittwoch 2. Februar 2022, 14:29
von Unxendlicher
Hallo,

Ich möchte ein Programm schreiben bei dem man sich einloggen kann und aber auch neue Accounts anlegen kann( was ich noch nicht richtig angefangen hab zu programmieren also lasst euch von dem else in der ersten Funktion nicht verwirren.

Code: Alles auswählen

import time

def namenabfrage() :
    #global ort_des_namens, name, namen
    namen = ["Markus", "Lisa", "Erik"]
    print("Hallo wie ist ihr Name: ", end="")
    name = str(input())
    laenge_der_liste = len(namen)
    if name in namen :
        for durchgang in range(0,laenge_der_liste):
             if name == namen[durchgang] :
                ort_des_namens = int(durchgang)
    else:
        print("Dieses Konto existiert noch nicht, möchtest du ein neues Konto anlegen? ")
        neueracc = str(input()) #danach eine neue funktion
    print("Test1")
    return ort_des_namens, name, namen

def passwortabfrage() :
    passwoerter = ["123", "halloichbinlisa", "0R7U2"]
    print("Hallo " + str(name) + "!")
    time.sleep(0.3)
    print("Wie lautet dein Passwort: ", end="")
    eingabe_passwort = str(input())
    if eingabe_passwort == passwoerter[ort_des_namens]:
        print("Login erfolgreich! ")
    else:
        print("Falsches Passwort! Noch ein Versuch: ",end="")
        eingabe_passwort = str(input())
        if eingabe_passwort == passwoerter[ort_des_namens]:
            print("Login erfolgreich! ")
        else:
            print("Nochmal falsch! ")

def endedesprogramms() :
    print("")
    time.sleep(0.5)
    print("Programmende")

#Main Programm
namenabfrage()
passwortabfrage()
endedesprogramms()
Nun ist das Problem das ich ohne die Variablen global zu machen sie gerne in passwortabfrage benutzen möchte. Ich habe schon einiges ausprobiert seit über 2h aber bis auf sie global zu nutzen habe ich keine Lösung gefunden.

Danke fürs lesen

Re: Globale und Lokale Variablen Problem

Verfasst: Mittwoch 2. Februar 2022, 14:49
von monaid

Code: Alles auswählen

def passwortabfrage(name) :
    pass
so?

Re: Globale und Lokale Variablen Problem

Verfasst: Mittwoch 2. Februar 2022, 14:53
von Unxendlicher
monaid hat geschrieben: Mittwoch 2. Februar 2022, 14:49

Code: Alles auswählen

def passwortabfrage(name) :
    pass
so?
was macht jzt "pass" Da? und es geht ja um Variablen

Re: Globale und Lokale Variablen Problem

Verfasst: Mittwoch 2. Februar 2022, 14:58
von monaid
das pass macht nichts , nur damit irgendwas in der function steht- als platzhalter für deinen functionskörper.

Code: Alles auswählen

 
def namenabfrage() :

    return {"ort": ort_des_namens,  "name" : name, "names": namen}

def passwortabfrage(name) :
    pass


person = namenabfrage()
print (person)
passwortabfrage(person["name"]])
ich weiss halt nicht genau was du suchst ...

Re: Globale und Lokale Variablen Problem

Verfasst: Mittwoch 2. Februar 2022, 15:03
von einfachTobi
Schau dir die Grundlagen über Funktionen und ihre Rückgabewerte an: https://docs.python.org/3/tutorial/cont ... -functions.
Beispiel:

Code: Alles auswählen

def check_password(password):
    correct_passwords = ("foo", "bar")
    return password in correct_passwords

def main():
    user_password = input("Bitte Passwort eingeben: ")
    if check_password(user_password):
        print("Passwort ok")
    else:
        print("Passwort nicht ok")

if __name__ == "__main__":
    main()

Re: Globale und Lokale Variablen Problem

Verfasst: Mittwoch 2. Februar 2022, 15:07
von Sirius3
Name abfragen und Passwort abfragen macht man normalerweise gemeinsam, sonst kann ein "Angreifer" verschiedene Namen durchprobieren und sobald er zur Passwortabfrage kommt, weiß er, welche Namen existieren.

`input` liefert bereits einen String zurück, den per `str` in einen String umwandeln zu wollen, ist unnötig. Ebenso ist `durchgang` bereits vom Typ `int`.
Die Rückgabewerte von `namenabfragen` mußt Du nehmen und an `passwortabfrage` weiterleiten.
Die for-Schleife in `namenabfragen` wird bereits durch die index-Methode gelöst.
`input` kann einen Prompt ausgeben, da braucht es keine extra `print`.
Strings stückelt man nicht mit + zusammen, sondern benutzt Formatstrings.

Code: Alles auswählen

import time

def namenabfrage() :
    namen = ["Markus", "Lisa", "Erik"]
    name = input("Hallo wie ist ihr Name: ")
    if name in namen:
        ort_des_namens = namen.index(name)
    else:
        print("Dieses Konto existiert noch nicht, möchtest du ein neues Konto anlegen? ")
        neuer_account_name = input() #danach eine neue funktion
    print("Test1")
    return ort_des_namens, name, namen

def passwortabfrage(ort_des_namens, name):
    passwoerter = ["123", "halloichbinlisa", "0R7U2"]
    print(f"Hallo {name}!")
    time.sleep(0.3)
    eingabe_passwort = input("Wie lautet dein Passwort: ")
    if eingabe_passwort == passwoerter[ort_des_namens]:
        print("Login erfolgreich! ")
        return True
    else:
        eingabe_passwort = input("Falsches Passwort! Noch ein Versuch: ")
        if eingabe_passwort == passwoerter[ort_des_namens]:
            print("Login erfolgreich! ")
            return True
        else:
            print("Nochmal falsch! ")
            return False

def main():
    ort_des_namens, name, namen = namenabfrage()
    if not passwortabfrage(ort_des_namens, name):
        print("Abbruch")
        return
    print("")
    time.sleep(0.5)
    print("Programmende")

if __name__ == "__main__":
    main()
Nun ist es schlecht, zwei Listen zu haben, eine mit Namen und eine separate mit Passwörtern. Das würde man auch nicht direkt im Programmcode speichern, sondern aus einer separaten Datei laden. Dazu braucht es auch eine Funktion.

Code: Alles auswählen

import time

def lade_nutzer():
    # TODO: aus Datei laden
    return {
        "Markus": "123",
        "Lisa": "halloichbinlisa",
        "Erik": "0R7U2",
    }

def login(nutzer):
    name = input("Hallo wie ist ihr Name: ")
    passwort = input("Wie lautet dein Passwort: ")
    if name in nutzer and nutzer[name] == passwort:
        print("Login erfolgreich! ")
        return name
    else:
        return None

def main():
    nutzer = lade_nutzer()
    name = login(nutzer)
    if not name:
        print("Abbruch")
        return
    print(f"Hallo {name}!")
    print("")
    time.sleep(0.5)
    print("Programmende")

if __name__ == "__main__":
    main()

Re: Globale und Lokale Variablen Problem

Verfasst: Mittwoch 2. Februar 2022, 17:57
von Unxendlicher
Sirius3 hat geschrieben: Mittwoch 2. Februar 2022, 15:07 Name abfragen und Passwort abfragen macht man normalerweise gemeinsam, sonst kann ein "Angreifer" verschiedene Namen durchprobieren und sobald er zur Passwortabfrage kommt, weiß er, welche Namen existieren.

`input` liefert bereits einen String zurück, den per `str` in einen String umwandeln zu wollen, ist unnötig. Ebenso ist `durchgang` bereits vom Typ `int`.
Die Rückgabewerte von `namenabfragen` mußt Du nehmen und an `passwortabfrage` weiterleiten.
Die for-Schleife in `namenabfragen` wird bereits durch die index-Methode gelöst.
`input` kann einen Prompt ausgeben, da braucht es keine extra `print`.
Strings stückelt man nicht mit + zusammen, sondern benutzt Formatstrings.

Code: Alles auswählen

import time

def namenabfrage() :
    namen = ["Markus", "Lisa", "Erik"]
    name = input("Hallo wie ist ihr Name: ")
    if name in namen:
        ort_des_namens = namen.index(name)
    else:
        print("Dieses Konto existiert noch nicht, möchtest du ein neues Konto anlegen? ")
        neuer_account_name = input() #danach eine neue funktion
    print("Test1")
    return ort_des_namens, name, namen

def passwortabfrage(ort_des_namens, name):
    passwoerter = ["123", "halloichbinlisa", "0R7U2"]
    print(f"Hallo {name}!")
    time.sleep(0.3)
    eingabe_passwort = input("Wie lautet dein Passwort: ")
    if eingabe_passwort == passwoerter[ort_des_namens]:
        print("Login erfolgreich! ")
        return True
    else:
        eingabe_passwort = input("Falsches Passwort! Noch ein Versuch: ")
        if eingabe_passwort == passwoerter[ort_des_namens]:
            print("Login erfolgreich! ")
            return True
        else:
            print("Nochmal falsch! ")
            return False

def main():
    ort_des_namens, name, namen = namenabfrage()
    if not passwortabfrage(ort_des_namens, name):
        print("Abbruch")
        return
    print("")
    time.sleep(0.5)
    print("Programmende")

if __name__ == "__main__":
    main()
Nun ist es schlecht, zwei Listen zu haben, eine mit Namen und eine separate mit Passwörtern. Das würde man auch nicht direkt im Programmcode speichern, sondern aus einer separaten Datei laden. Dazu braucht es auch eine Funktion.

Code: Alles auswählen

import time

def lade_nutzer():
    # TODO: aus Datei laden
    return {
        "Markus": "123",
        "Lisa": "halloichbinlisa",
        "Erik": "0R7U2",
    }

def login(nutzer):
    name = input("Hallo wie ist ihr Name: ")
    passwort = input("Wie lautet dein Passwort: ")
    if name in nutzer and nutzer[name] == passwort:
        print("Login erfolgreich! ")
        return name
    else:
        return None

def main():
    nutzer = lade_nutzer()
    name = login(nutzer)
    if not name:
        print("Abbruch")
        return
    print(f"Hallo {name}!")
    print("")
    time.sleep(0.5)
    print("Programmende")

if __name__ == "__main__":
    main()
[/quote]

Hey,

Danke für die lange Antwort, hat mir weitergeholfen!
Nur was macht genau die Zeile :
[code]
if name in nutzer and nutzer[name] == passwort:
"Markus" und "123" sind ja nur Strings wie kann den Python wissen was mit passwort gemeint ist es ist ja einfach nur ein string der in "nutzer" gespeichert ist oder?
Und was hat es mit dem ":" in der return Aufforderung auf sich?

Re: Globale und Lokale Variablen Problem

Verfasst: Mittwoch 2. Februar 2022, 20:08
von Sirius3
Das, was `lade_nutzer` zurückliefert ist ein Wörterbuch, wunderbar dafür geeignet, einem Namen ein Passwort zuzuordnen. Wenn Du nicht weißt, was das ist, oder wie man es verwendet, solltest Du das dringend in Deinem Pythonlehrwerk nachlesen.