Hallo zusammen,
ich habe seit einigen Wochen begonnen mit Python zu programmieren und möchte meinen Horizont erweitern. Ich komme eigentlich aus der Datenanalyse im Fussball und möchte mit Python ein paar Anwendungen in diesem Bereich erstellen. Bis dahin ist es aber noch ein langer Weg, daher habe ich mir ein Einsteigerbuch gekauft und arbeite es aktuell durch.
Ich habe eine kurze Frage zu einer Funktion aus dem Buch. Der Code lautet: (Es wird eine Funktion für einen Passwortabgleich erstellt)
def registrierung (nutzername,passwort):
logindaten=[("robert","abcde")]
for zugang in logindaten:
if zugang[0]==nutzername and zugang[1]==passwort:
print("erfolgreich")
else:
print("nicht erfolgreich")
wert1=input()
wert2=input()
registrierung(wert1,wert2)
Meine Frage nun: in der zweiten Zeile wird eine Liste "logindaten" erstellt. Warum müssen dort die runden Klammern gesetzt werden (vor robert und nach abcde)
Verstehe ich es richtig, dass for-schleife nun diese Liste durchgeht und die Variable zugang jeweils den ersten und zweiten Wert aufnimmt und diesen mit "robert" und "abcde" vergleicht?
ich hoffe, die Frage ist verständlich formuliert! Vielen Dank im Voraus für eure Mühe!
Viele Grüße!
Anfängerfrage zu Funktionen und Listen
- sls
- User
- Beiträge: 480
- Registriert: Mittwoch 13. Mai 2015, 23:52
- Wohnort: Country country = new Zealand();
@tactics: bitte den Code künftig mit Code-tags </> posten, sonst gehen wichtige Einrückungen verloren und der Code wird unbrauchbar.
Zu deiner Frage: ja, `nutzername` und `passwort` sind das was der Funktion `registrierung` übergeben und dann mit den bestehenden Einträgen in `logindaten` vergleicht. Das ganze Beispiel ist aber ziemlich ungünstig, da es sich dabei nicht um eine *Registrierung* handelt, sondern eher um eine Anmeldung, also dem Abgleich der Anmeldedaten. Ein Tupel soll hier wohl mehrere Benutzereinträge ermöglichen ist aber deshalb unbrauchbar, da Tupel beliebige Einträge mit den selben Werten erlauben. Es könnte also `robert` öfter mit unterschiedlichem Passwort vorkommen. Geeigneter wäre ein Dictionary.
`wert1` und `wert2` sind überdies schlechte Variablenbezeichner, man sollte das Kind schon beim Namen nennen, z.B. `name`, `passwort`. input() Bietet auch die Möglichkeit einen Text in der Konsole anzuzeigen, damit man nach dem Programmstart als Benutzer weiß was man tun muss -> input("Bitte Benutzername eingeben: ")
Für die Eingabe von Passwörtern in der Kommandozeile kann man dann gleich auch noch getpass() benutzen.
Auf Modulebene sollte nur Code stehen der Konstanten, Klassen und Funktionen definiert. Alles andere gehört in eine Main-Methode.
Vereinacht:
Das Beispiel hat noch seine Schwächen, die Frage ist ob man dem Nutzer auch das Feedback geben möchte ob der eingegebene Benutzer überhaupt existiert. Ich habe das bewusst weggelassen, eine Möglichkeit wäre dann Eingaben vom Benutzer mittels try/except abzufangen.
Man könnte im weiteren Schritt dann noch eine Funktion für die Benutzerregistrierung implementieren.
Zu deiner Frage: ja, `nutzername` und `passwort` sind das was der Funktion `registrierung` übergeben und dann mit den bestehenden Einträgen in `logindaten` vergleicht. Das ganze Beispiel ist aber ziemlich ungünstig, da es sich dabei nicht um eine *Registrierung* handelt, sondern eher um eine Anmeldung, also dem Abgleich der Anmeldedaten. Ein Tupel soll hier wohl mehrere Benutzereinträge ermöglichen ist aber deshalb unbrauchbar, da Tupel beliebige Einträge mit den selben Werten erlauben. Es könnte also `robert` öfter mit unterschiedlichem Passwort vorkommen. Geeigneter wäre ein Dictionary.
`wert1` und `wert2` sind überdies schlechte Variablenbezeichner, man sollte das Kind schon beim Namen nennen, z.B. `name`, `passwort`. input() Bietet auch die Möglichkeit einen Text in der Konsole anzuzeigen, damit man nach dem Programmstart als Benutzer weiß was man tun muss -> input("Bitte Benutzername eingeben: ")
Für die Eingabe von Passwörtern in der Kommandozeile kann man dann gleich auch noch getpass() benutzen.
Auf Modulebene sollte nur Code stehen der Konstanten, Klassen und Funktionen definiert. Alles andere gehört in eine Main-Methode.
Vereinacht:
Code: Alles auswählen
def anmeldung(nutzername, passwort):
logindaten = {"robert": "abcde"}
if nutzername in logindaten and logindaten[nutzername] == passwort:
print("Erfolgreich")
else:
print("Nicht erfolgreich")
def main():
name = input("Bitte Name eingeben: ")
passwort = input("Bitte Passwort eingeben: ")
anmeldung(name, passwort)
if __name__ == '__main__':
main()
Man könnte im weiteren Schritt dann noch eine Funktion für die Benutzerregistrierung implementieren.
When we say computer, we mean the electronic computer.
Danke für die ausführliche Antwort! Die Einrückung werde ich beim nächsten Mal beachten.
If...in...and finde ich verständlicher, werde ich mir merken!
Zwei Fragen habe ich noch:
1) Was passiert genau bei diesem Befehl?
if __name__ == '__main__':
main()
2) logindaten=[("robert","abcde")]
Wofür sind hier die runden Klammern, was wird hiermit signalisiert?
Danke für die Hilfe.
If...in...and finde ich verständlicher, werde ich mir merken!
Zwei Fragen habe ich noch:
1) Was passiert genau bei diesem Befehl?
if __name__ == '__main__':
main()
2) logindaten=[("robert","abcde")]
Wofür sind hier die runden Klammern, was wird hiermit signalisiert?
Danke für die Hilfe.
- sls
- User
- Beiträge: 480
- Registriert: Mittwoch 13. Mai 2015, 23:52
- Wohnort: Country country = new Zealand();
Wenn du mit dem Python-Interpreter deine Programmdatei direkt aufrufst, trifft die Bedingung "if __name__ == '__main__'" zu, und der hier definierte Code wird ausgeführt, in dem Falle also die main-Funktion aufgerufen. Es gibt aber auch Fälle in dem du deine `anmeldung`-Funktion oder andere Code-Teile in eine andere Pythondatei importieren möchtest, aber nicht den grundsätzlichen Programmablauf ausführen möchtest, hier z.B. die Benutzerabfragen mittels input().tactics hat geschrieben: Samstag 28. November 2020, 11:40 1) Was passiert genau bei diesem Befehl?
if __name__ == '__main__':
main()
Das kannst du selber abfragen, in dem du die Builtin-Funktion `type` verwendest. Achte aber darauf, dass du den Typ des Eintrags in logindaten nur herausfinden kannst, wenn du dieses Element aus logindaten direkt adressierst, sonst erhältst du den Datentyp des Containers `logindaten`.tactics hat geschrieben: Samstag 28. November 2020, 11:40 2) logindaten=[("robert","abcde")]
Wofür sind hier die runden Klammern, was wird hiermit signalisiert?
When we say computer, we mean the electronic computer.