Das ist mein erstes "Programm". Was haltet ihr davon?

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Das ist mein erstes "Programm". Was haltet ihr davon?? Schau mal ob du hier fündig wirst!

    • Hilfreichste Antwort

    Hallo,

    was sich über den ganzen Code zieht: Eingerückt wird immer mit immer 4-Leerzeichen-Takt.

    Du kannst dein 'print' und 'input' verbinden:

    registrieren = input('Tippe etwas ein: ')

    Du schreibst viele Schleifen in Schleifen und sagst dem Benutzer immer wieder er soll 'registrieren' oder 'anmelden' eingeben. Ich finde aber keinen Code der ausgeführt wird, wenn 'registrieren' eingeben wurde. Stattdessen soll was passieren, wenn "1" eingegeben wurde. Und dann wenn "2" eingegeben wurde funktioniert dein Code laut Kommentar nicht. Das Problem ist, wenn du nach einer Eingabe abfragen willst, dann ist die Eingabe vom Typ String. Das heißt wenn du wissen willst ob 1 oder zwei eingegeben wurde, dann musst du if registrieren == "1": schreiben.

    Das ist mir jetzt mal auf den ersten Blick aufgefallen. Da du offensichtlich Python lernen willst, finde ich, das es nicht viel Sinn macht das Programm nach Logik-Fehler zu durchsuchen. Stattdessen würde ich dir empfehlen dich jetzt mit Funktionen zu beschäftigen. Dazu kannst du das offizielle Python.Tutorial nutzen.

    Es ist nämlich nicht üblich in Python einfach Code von oben nach unten zu schreiben. Klar zum Start in die Welt kann man so einiges ausprobieren. Jetzt hast du aber schon gemerkt dass du immer mal wider die gleiche Codezeile schreiben musstest. Das ist nicht nur nervig, sondern auch fehleranfällig, zum einen während der Programmierung zum anderen wenn man den Code abändern will. Da muss man dann jede Zeile wieder finden. Man kann dafür Funktionen schreiben, diese werden bei bestimmten Ereignissen aufgerufen.

    Das macht das Programm auch viel einfach zu lesen, verstehen, zu verändern und auch kürzer.

    Arbeite dich mal durch das Tutorial und versuche dein Programm dann nochmals mit Funktionen zu schreiben :thumbup:

    Hoffe dir hilft das weiter, auch wenn ich nicht so direkt auf jede Codezeile eingegangen bin.

    Grüße

    Dennis

    🎧 With the music execution and the talk of revolution, it bleeds in me and it goes 🎧

  • Oh wow, danke dir. Das habe ich tatsächlich vergessen zhu ändern. eigentlich sollte da der Input stehen den ich will. ( Interessanterweise klappt es so ?. Ja das ändere ich

    Ich weiß das man den Text in den Input packen kann, allerdings gefällt es mir tatsächlich optisch so sehr gut

  • Ich hoffe du liest das. Ich habe deine Tipps befolgt und hier ist eine defintiv verbesserte version davon :D

  • Wie wäre es wenn du Mal erzählst was dein Programm überhaupt machen soll?

    Und wie wäre es wenn du dich tatsächlich Mal mit Funktionen beschäftigst, wie es Dennis dir schon geraten hat?

    Ganz nett wäre auch wenn du deinen Code im Codeblock </>  Posten würdest.

    Wenn die Enrückungen da nicht passen, so mach es passend. Ich hab nämlich keine Lust mit ständig irgendwelche Dateien runterzuladen.

    Wenn du mit der offiziellen Python Doku nicht zurecht kommst so gibt's auf Python-lernen.de eine recht gute und in deutsch verfasste Einführung.

    Ich weiß das man den Text in den Input packen kann, allerdings gefällt es mir tatsächlich optisch so sehr gut

    Kann man so machen, muss man aber nicht, weil dein Code nur unleserlich wird.

  • Hallo,

    lassen wir mal wider die Programmlogik auf der Seite. Wenn du jetzt dein Programm noch aus einer Funktion steuerst die 'main' heißt und dann keinen Code mehr auf Modulebene hast (Bei dir ab Zeile 172), der dein Programm steuert, dann ist der Aufbau schon mal angepasst. Die 'main' Funktion wird am Ende des Codes mit :

    Code
    if __name__ == '__main__':
        main()

    aufgerufen (Ja der darf auf Modulebene stehen). Erklärung darüber findest du hier.

    Dann kann man sich mal über deinen Ablauf Gedanken machen. Es geht schon damit los, dass du dem Anwender sagst, er soll 'registrieren' eingeben. Dann kommt aber von dir eine Abfrage, ob 'anmelden' eingegeben wurde. Wieso? Das steht doch gar nicht zur Wahl. Zuwas rufst du 'strip()' auf?

    Wenn wir das 'Login_Verfahren' erreichen, dann solltest du dir gleich angewöhnen, das man Funktionsnamen und Variabeln klein_mit_unterstrich schreibt. Funktionsnamen sollten beschreiben was eine Funktion macht. Ein Loging-Verfahren ist das aber nicht, denn gleich in der dritten Zeile überschreibst du das Benutzerkonto. Bevor sich in deinem Programm jemand anmelden kann, sollte erst mal jemand registriert sein, den jetzt ist dein Benutzer noch "None".

    Deine Login-Funktion ergibt für mich auch wenig Sinn. Was macht die außer Eingaben entgegennehmen mit denen nicht weiter gearbeitet wird?

    Die ganzen verschachtelten Schleifen sind nicht gerade übersichtlich und machen es echt schwer den Code zu verstehen und ihn auszubauen. Das funktioniert auch mit weniger Schleifen.

    Es ist wichtig dass du nicht versucht alles auf einmal zu machen. Zerlege dein Programm in viele kleine Probleme und löse eins nach dem anderen. Dann kommt das zusammenfügen und dabei musst du dir überlegen, welche Probleme abgefangen werden müssen und was nicht passieren darf und du musst dir bewusst machen, was aber alles passieren kann. So baust du dein Programm Stück für Stück aus.

    Schau dir mal den Code an, der hat wie deiner auch keinen größeren Sinn, aber so in die Richtung sollte/könnte es aussehen. Natürlich ist das nur ein Beispiel, ich habe mir jetzt nicht lange Gedanken über den Ablauf und eventuelle Fehleingabe und sonstiges gemacht. Aber versuche den mal nachzuvollziehen. So das du wirklich jede Codezeile verstehst. Das ist wichtig. Dann kannst du ihn erweitern.

    Grüße

    Dennis

    Oh man, jetzt ist das Fenster seit Stunden offen und ich habe nicht auf "Antworten" geklickt :sleeping:

    🎧 With the music execution and the talk of revolution, it bleeds in me and it goes 🎧

  • Dennis, kann es sein, dass dein Programm so nicht funktioniert?

    Du legst eine neue Instanz von Benutzerkonto als benutzer an. Dann kannst du wählen zwischen anmelden und registrieren. An dieser Stelle wäre anmelden noch gar nicht möglich. Zunächst müsstest du also registrieren wählen. Dann hinterlegst du im Objekt benutzer den Namen und das Passwort.

    Wenn du nun als nächstes anmelden wählst, kannst du Namen und Passwort eingeben. Du kannst dich aber ohnehin nur mit dem einen Benutzer anmelden, der im Objekt benutzer hinterlegt ist. Das Programm bietet keine Möglichkeit, einen zweiten Benutzer anzulegen und die Anmeldeprozedur hat auch gar keine Möglichkeit, in mehreren Benutzerkonten nachzusehen, welcher User sich da gerade anmelden will. Du kannst also weder einen zweiten Benutzer registrieren, noch bei der Anmeldung tatsächlich den Namen (und das Passwort) variieren. Mit diesem Programm kann nur ein einziger Benutzer verwaltet werden.

    Sinnvoller wäre es, zuerst zu fragen, ob Registrierung oder Anmeldung gewünscht ist.

    Bei Registrierung müsste Name und Passwort eingegeben werden und dann ein neues Objekt erstellt werden. Außerdem müssten die Objektbezeichner in einem Dictionary geführt werden, damit man beim Anmelden das korrekte Benutzerkontenobjekt anhand des Namens auswählen kann.

    Beim Anmelden würde dann das Objekt gemäß Username aus dem Dictionary ermittelt werden und die Prüfung dann gegen die Attribute des Objekts vorgenommen werden.

    Also, smokerman, aller Anfang ist bekanntlich schwer. Computer ticken anders als Menschen, weil sie keine Intuition haben. Die Art, wie und in welcher Reihenfolge Entscheidungen getroffen werden, ist ganz anders als beim Menschen. Es fällt vielen Anfängern schwer, sich in diese starre Logik des Computers hineinzuversetzen. Man sieht an deinem Programm, das du sehr stark aus der Richtung des Benutzers denkst. Du müsstest aber mehr von der anderen Seite her denken. Leider ist das recht schwer zu vermitteln - zumindest mit ein paar Sätzen in einem Forum.

    Es gibt jede Menge Video-Tutorials und Anleitungen für einfache Programme, mit denen man die Grundlagen üben kann. Mach dich mal an solche Ding dran und schau dir an, wie andere sowas lösen. Da wirst du schnell ein Gefühl dafür bekommen, wie man sowas angeht.

    Dennis' Programm geht ein ganz klein wenig bereits in Richtung Objektorientierung. Das ist heute eigentlich die übliche Art, zu programmieren. Ich würde dir empfehlen, von Anfang an objektorientierte Programmierung zu lernen. Wenn du erst funktional programmiertst, ist der Umstieg später schwer.

    Außerdem baut man heute kaum mehr Programme mit Konsoleneingaben. Für erste Übungen ist das ok, aber wenn du mal was wirkich Anwendbares programmieren willst, wirst du auch eine grafische Oberfläche haben wollen. Insofern solltest du dich auch beizeiten mit sowas beschäftigen, z.B. mit Tkinter. Die Programmierung mit solchen Oberflächen ist deutlich anders als mit der Konsole, weil du plötzlich eine sogenannte Event-loop hast - also den Teil der Grafik, der im Hintergrund ständig registriert, ob jemand was eintippt oder mit der Maus irgendwo drauf klickt, und du musst dein Programm so schreiben, dass es auf diese Eingaben und Mausklicks reagiert. Auch das ist eine ganz andere Sichtweise als die "Inputs" über die Konsole.

    Die Konsole ist prima, um einzelne Befehle und kleine Programmschnipsel auszuprobieren. Für den Einstieg prima, um Schleifen und Bedingungen zu testen, um zu verstehen, wie das funktioniert. Wenn du programmieren lernen willst, solltest du dir aber auf jeden Fall die Objektorientierung ansehen. Es gitb jede Menge Videos zu Python und Objektorientierung, die das gut erklären.

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

  • Hi Gnom,

    das Programm an sich funktioniert so schon, wenn kein Benutzer angelegt ist, kommt die Meldung dass man sich erst registrieren muss. Mit allem anderen hast du recht und das ist/war mir auch bewusst. Deswegen schrieb ich, dass das Programm keinen tieferen Sinn hat und ich damit nur mal einfach zeigen wollte wie die Struktur aufgebaut wird und das man nicht soviele verschachtelten Schleifen benötigt. Es sollte ansatzweise das machen, was der original Code macht.

    Ich hoffe dass der TE daran den Programmablauf erkennen und verstehen kann und dann deine erwähnten Verbesserungen einbauen kann. Dann wäre der Lerneffekt höher.

    Grüße

    Dennis

    🎧 With the music execution and the talk of revolution, it bleeds in me and it goes 🎧

  • Ich lasse mal folgendes auf euch los:


    Mit pickle speichere ich die Daten (Unsicher). Statdessen könnte man json oder eine echte Datenbank verwenden.

    pbkdf2_hmac um sichere Hashes aus den Passwörtern zu generieren. Ein Salt wird natürlich auch benötigt.

    Die Anzahl der Iterationen könnte weiter erhöht werden, um Angriffe zu erschweren.

    compare_digest vergleicht einfach nur zwei byte-strings, fügt aber noch eine kurze Wartezeit mit ein, um Timing-Attacken zu verhindern.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!