Seite 1 von 1

Kann sich das mal jemand ansehen?

Verfasst: Freitag 31. März 2023, 22:09
von anonym109
Habe jetzt die ersten Schritte geschafft, zumindest macht es das was es soll.

Aber wie immer gibt es ja sicherlich Verbesserungen, einige Dinge die Verkürzt werden können und wahrscheinlich auch Sachen die sich überhaupt nicht so gehören.

Code: Alles auswählen

vorname = ""
age = int
nachname = ""


def Alter():
    while True:
        global age
        try:
            age = input("Bitte dein Alter eingeben:")
            age = int(age)
            break
        except ValueError:
            print('Das war keine Zahl!')
    if age >= 18:
        print('Willkommn bei deinem ersten Pythonprogramm')
    else:
        print('Leider kannst du diesen Dienst nicht nutzen!')
        print()
        exit()


def Vorname():
    while True:
        global vorname
        vorname = input('Bitte Vornamen eingeben:')
        if vorname.isalpha():
            print('Eingabe erfolgreich')
            break
        else:
            print('Bitte nur Buchstaben eingeben!')


def Nachname():
    while True:
        global nachname
        nachname = input('Bitte Nachnamen eingeben:')
        if nachname.isalpha():
            print('Eingabe erfolgreich')
            break
        else:
            print('Bitte nur Buchstaben eingeben!')


def Zusammenfassung():
    print(age)
    print(vorname)
    print(nachname)


def Abfrage():
    while True:
        print('Bitte Eingaben Prüfen:')
        benutzerantwort = input('Alles richtig Y oder N')
        if benutzerantwort.lower() == 'y':
            print('Herzlichen Glückwunsch')
            print('Anmeldung erfolgreich')
            exit()
        elif benutzerantwort.lower() == 'n':
            print('Bitte Daten korrigieren!')
            Start()

        else:
            print('Bitte Nur Y oder N eingeben!')
            Abfrage()


def Start():
    while True:
        Alter()
        Vorname()
        Nachname()
        Zusammenfassung()
        Abfrage()


Start()

Wäre schön wenn ihr euch das mal anseht und dann auf die Einzelnen Punkte eingeht die man verbessern sollte.

Was mir ein wenig Sorgen macht ist der Funktionsaufruf, der bestimmt nicht ganz sauber ist und das mit den globalen Variablen,
allerdings wüsste ich nach meinem jetzigen Wissenstand (0,0001%) nicht wie man es anders bauen kann :roll:

So jetzt könnt ihr den Vorschlaghammer rausholen :lol:

Re: Kann sich das mal jemand ansehen?

Verfasst: Freitag 31. März 2023, 22:42
von sparrow
Ich fange mal mit der grundlegenden Struktur an. Da wird sich eine Menge draus ergeben.

Globale Variablen sind böse. Man möchte sie niemals benutzen und sich das auch gar nicht erst angwöhnen.

Der Einstiegspunkt eines Programms sollte immer so aussehen:

Code: Alles auswählen

def main():
    # your code starts here

if __name__ == "__main__":
    main()
Am Ende der Datei, die du direkt aufrufen willst, steht die if-Bedingung. Sie sorgt dafür, dass die main-Funktion nur aufgerufen wird, wenn dein Modul nicht importiert wird.

Dann gilt: Auf Modulebene - also ohne Einrückung - stehen nur: Importe, die Definition von Klassen, Funktionen und Konstanten. Und eben die if-Abfrage um die main-Funktion aufzurufen.

Damit verschwinden also die ersten 3 Zeilen (wobei age=int sowieso Blödsinn ist, weil du damit einfach den Namen der internen Klasse int an den Namen "age" bindest. Das ist also nicht, was du denkst).

In Python werden Namen klein_mit_unterstrich geschrieben. Ausnahmen: Konstanten (KOMPLETT_GROSS) und die Namen von Klassen (PascalCase).

Funktionen werden in der Regel nach der Tätigleit benannt, die sie ausführen.

Funktionen erhalten alles, was sie zum Arbeiten brauchen als Parameter und geben das Ergebnis mit "return" zurück.
Du musst dich also damit beschäftigen, was Funktionen sind und wofür sie da sind. Für dich sind sie einfach nur Sprungpunkte. Dafür sind sie nicht da.
Und wenn du keine globalen Variablen verwendest, wirst du gezwungen das richtig zu machen.

Re: Kann sich das mal jemand ansehen?

Verfasst: Samstag 1. April 2023, 12:20
von Sirius3
@Sculprica: ›global‹ darf es in einem ordentlichen Programm nicht geben, Funktionen geben ihr Ergebnis per ›return‹ zurück. Funktionen werden wie Variablennamen auch, komplett klein geschrieben, und sind nach Tätigkeiten benannt, also ›alter_eingeben‹ statt nur ›Alter‹.
›exit‹ kommt in einem ordentlichen Programm nicht vor, zumindest nicht ohne Argument. Auch dann darf ›exit‹ nur in der ›main‹-Funktion stehen.
Rekursion ist kein Ersatz für saubere Schleifen, vor allem nicht, wenn Du immer weiter verschachtel Funktionen aufrufst: ›Start‹ ruft ›Abfrage‹ auf, das ›Start‹ aufruft, usw.

Die Funktion Vorname und Nachname sind quasi identisch, also reicht dafür eine Funktion.
Dass die Funktio ›Alter‹ sowohl das Alter abfragt, als auch prüft, ist zu viel für eine Funktion.

Code: Alles auswählen

def alter_eingeben():
    while True:
        try:
            return input("Bitte dein Alter eingeben:")
        except ValueError:
            print('Das war keine Zahl!')

def name_eingeben(prompt):
    while True:
        name = input(f'Bitte {prompt} eingeben:')
        if name.isalpha():
            break
        print('Bitte nur Buchstaben eingeben!')
    print('Eingabe erfolgreich')
    return name

def daten_korrekt():
    while True:
        print('Bitte Eingaben Prüfen:')
        benutzerantwort = input('Alles richtig Y oder N')
        if benutzerantwort.lower() == 'y':
            return True
        elif benutzerantwort.lower() == 'n':
            return False
        print('Bitte Nur Y oder N eingeben!')


def main():
    while True:
        alter = alter_eingeben()
        if age >= 18:
            print('Willkommn bei deinem ersten Pythonprogramm')
        else:
            print('Leider kannst du diesen Dienst nicht nutzen!')
            print()
            return
        vorname = name_eingeben('Vorname')
        nachname = name_eingeben('Nachname')
        print(alter)
        print(vorname)
        print(nachname)
        if daten_korrekt():
            break
    print('Herzlichen Glückwunsch')
    print('Anmeldung erfolgreich')

if __name__ == "__main__":
    main()

Re: Kann sich das mal jemand ansehen?

Verfasst: Montag 3. April 2023, 11:41
von punix
Ich hätte es so gemacht. Bin auch blutiger anfänger. Da gibt's bestimmt auch noch verbesserungen von dem einen oder anderen.

Code: Alles auswählen

#!/usr/bin/python3

def main():  # Funktionskopf
    firstname = input('Bitte Vornamen eingeben.\n')  # Variable in die der Wert vom Nutzer zugewiesen wird.
    lastname = input('Bitte Nachnamen eingeben.\n')  # Variable in die der Wert vom Nutzer zugewiesen wird.
    age = input('Bitte Alter eingeben.\n')  # Variable in die der Wert vom Nutzer zugewiesen wird.
    while True:
        try:
            int(age)
            print('Vorname: ', firstname, '\n''Nachname: ', lastname, '\n' 'Alter: ', age)  # Ausgabe aller eingegeben Werte
    # auf der Konsole.
            break
        except ValueError:
            print('Bitte nur Zahlen eingeben!')
            main()
    for i in range(2):  # For Schleife mit parameter angabe 2 durchläufe.
        question = input('Eingabe korrekt? (j/n)\n')  # Variable in die der Wert vom Nutzer zugewiesen wird.
        if question.lower() == 'j':  # Bedingung ob j eingegeben wurde, wird geprüft.
            if int(age) >= 18:  # Weitere prüfung ob 18 oder eine größere Zahl als 18 eingegeben wurde.(Mit int umwandlung)
                print('Willkommen im Club!')  # Ausgabe auf der Konsole. Gewünschtes ergebnis.
                input('Zum beenden Enter drücken.')
                exit()  # Verlassen der Schleife
            if int(age) < 18:  # Weitere prüfung ob eine kleinere Zahl als 18 eingegeben wurde.(Mit int umwandlung)
                print('Du bist noch keine 18!')  # Ausgabe auf der Konsole. Gewünschtes ergebnis.
                input('Zum beenden Enter drücken.')
                exit()  # Verlassen der Schleife
        elif question.lower() == 'n':  # Bedingung ob n eingegeben wurde, wird geprüft.
            print('OK. Bitte die eingaben wiederholen.\n')
            main()
        else:
            print('Keine gültige eingabe! Du Schlingel!\n')
            input('Zum beenden Enter drücken.')
            exit()  # Verlassen der Schleife


if __name__ == "__main__":
    main()

Re: Kann sich das mal jemand ansehen?

Verfasst: Dienstag 4. April 2023, 00:31
von imonbln
@punix
Als Erstes fällt auf, dass du Kommentare falsch nutzt. Mein Informatiklehrer hätte dir gesagt, ich kann lesen. Was damit gemeint ist, ein Kommentar sollte erklären, warum etwas gemacht wird und nicht wie etwas gemacht wird. Außerdem muss man nicht jede Zeile kommentieren, sondern nur was nicht offensichtlich ist. Eine gute Regel lautet: Kann man die Funktionalität mithilfe des Quelltextes klar formulieren, so sollte man es auch tun, ansonsten muss es mit einem Kommentar erklärt werden.

Der Teil ist Quatsch, denn entweder ist die Eingabe des alters eine Zahl, dann wird das while True verlassen oder es kommt zu Exception. Dann ruft die Funktion main sich Rekursive selbst auf. In beiden Fällen wird die Schleife nach dem ersten Durchlauf verlassen.

Code: Alles auswählen

    while True:
        try:
            int(age)
            print('Vorname: ', firstname, '\n''Nachname: ', lastname, '\n' 'Alter: ', age)  # Ausgabe aller eingegeben Werte
    # auf der Konsole.
            break
        except ValueError:
            print('Bitte nur Zahlen eingeben!')
            main()
Dass die Funktion main sich in der Exception selbst aufruft, ist IMHO der größere Fehler, hier sollte einfach die Eingabe wiederholt werden, eine Fehlerbehandlung durch Rekursion ist selten sinnvoll. Ich schlage vor für die Eingabe es alters eine eigene Funktion zu schreiben, welche so lange fragt bis eine Zahl eingeben wurde.

Code: Alles auswählen

def int_input(text):
    while True:
        try:
            number = input(text)
            return int(number)
        except ValueError:
            print(f"kann {number} nicht zum Interger machen")
Der Sinn des for loop erschließt sich mir nicht, auch hier liegt wieder keine schleife vor, weil die Schleife in allen fällen durch Programmende oder Rekursion nach einem Durchgang verlassen wird. Generell gilt aber in Python, dass es selten sinnvoll ist ein for-loop über eine range zu machen, da man immer über die Objekt direkt Iterieren kann.


Die folgende zwei if-abfragen sollte eigentlich eine if-else-abfrage sein, entweder "age" ist kleiner-gleich 18 oder nicht.

Code: Alles auswählen

 if int(age) >= 18:  # Weitere prüfung ob 18 oder eine größere Zahl als 18 eingegeben wurde.(Mit int umwandlung)
                print('Willkommen im Club!')  # Ausgabe auf der Konsole. Gewünschtes ergebnis.
                input('Zum beenden Enter drücken.')
                exit()  # Verlassen der Schleife
 if int(age) < 18:  # Weitere prüfung ob eine kleinere Zahl als 18 eingegeben wurde.(Mit int umwandlung)
                print('Du bist noch keine 18!')  # Ausgabe auf der Konsole. Gewünschtes ergebnis.
                input('Zum beenden Enter drücken.')
                exit()  # Verlassen der Schleife
Das mag auf den ersten Blick nur nach Semantik aussehen, hilft aber den Leser des Codes und den Python Interpreter ungemein beim Verständnis des Sourcecodes. Nebenbei "age" ist ein String, denn du 3-mal zu einem integer konvertierst, wenn du wie von mir Vorgeschlagen, das gleich bei der Eingabe machst, brauchst du nicht andauert, dasselbe zu machen.

Das Beenden des Programms mit exit() ist schlechter Still, das solltest du dir gar nicht erst angewöhnen, obwohl es in der Main Funktion und nur hier vielleicht erlaubt sein kann. Eine Funktion sollte immer nur sich selbst beenden. Entweder durch das Ende der Funktion (implizites Return), durch das Schlüsselwort return (explizites Return) oder durch eine Exception (im Fehlerfall). Der Hintergrund ist zum einen, dass es viel schwerer ist, Modultest zu entwickeln für Codepfade, welche das Programm beenden und zum andern, wenn du später Funktionen in andern Programmen wieder verwenden willst,  sein kann, dass dein Programm ein Plan-B hat, falls die Funktion nicht erfolgreich ist, diesen aber nicht ausführen kann, wenn die Funktion das Programm beendet.

Re: Kann sich das mal jemand ansehen?

Verfasst: Dienstag 4. April 2023, 05:59
von Dennis89
Guten Morgen,

ich hätte noch ein 'int()' übrig und würde dass der Zeile 3 aus dem Code von @Sirius3 spendieren. Ich denke mal das war bestimmt so gedacht. Das eingeschlichene 'age' in der main-Funktion nehme ich auch gleich mit und lasse ein 'alter' da. 🙂

Grüße
Dennis

Re: Kann sich das mal jemand ansehen?

Verfasst: Dienstag 4. April 2023, 08:16
von punix
@imonbln

Danke für die Hinweise. :P Ist alles einleuchtend für mich.
Da hab ich noch ne weile "Hausaufgaben". Die Kommentare hab ich nur wegen dem ersten Post rein. Normalerweise kleister ich net so viel :D. Mit dem age hatte ich mir auch schon gedacht das ich dafür ne Funktion schreiben muss.
Hatte zuerst age = int(input'bitte Text eingeben'), das hat aber nicht funktioniert mit Try. Ich setzt mich da aber nochmal dran. Deine Tips sind auf jeden Fall sehr hilfreich. Euch noch einen schönen Tag.

Re: Kann sich das mal jemand ansehen?

Verfasst: Dienstag 4. April 2023, 13:13
von DeaD_EyE
Lasst die Kommentare einfach mal weg.

Code: Alles auswählen

firstname = input('Bitte Vornamen eingeben.\n')  # Variable in die der Wert vom Nutzer zugewiesen wird.
Kommentare macht man nur, um z.B. zu erklären, wieso man so vorgegangen ist.

Im schlimmsten Fall sind die Kommentare falsch und weichen von dem ab, was der Code macht.