Seite 1 von 1

Eingabe der Input funktion formatieren

Verfasst: Montag 26. April 2021, 11:23
von iWischMob
Hallo Zusammen!
Ich bin gerade dabei mich etwas an das Programmieren heranzutasten, und habe einen Rechner für den Durschnittsverbrauch an Kraftstoff eines Autos geschrieben.
Nun Frage ich mich wie man bei der input() funktion (Die ja soweit ich das verstanden hab die Nutzereingabe als string zurück gibt)
gewisse Sachen noch vor ausführung ersetzen kann.

Erstmal ein Beispiel:

In meinem Fall würde der Nutzer vermutlich bei der Eingabe der Kilometer intuitiv ein "," statt eines "." bei der eingabe verwenden was dann natürlich einen String darstellt der sich auch nicht mehr zu einer Gleitkommazahl ändern lässt.

Frage: Kann ich automatisch das Komma zu einem Punkt ersetzen lassen ?

Habe schon etwas im Internet gesucht, aber bisher ohne wirkliches Ergebnis.

Danke schonmal für eure Kommentare. :D



Hier noch der gesamte Code, wenn jemand den Kommentieren möchte nur zu, ich freue mich auf Tipps. oder Verbesserungsvorschläge

Code: Alles auswählen

Strecke_bestimmt = False
Kraftstoffmenge_bestimmt = False
Gefahrene_strecke = 1
Verbrauchte_liter = 1

def Durschnittsverbrauch_berechnen():
    global Durschnittsverbrauch
    Durschnittsverbrauch = ((Verbrauchte_liter / Gefahrene_strecke) * 100)


# Gefahrene KM bestimmen, solange bis eine Korrekte eingabe erfolgt
while Strecke_bestimmt == False:
    print("Bitte geben sie die Gefahrene Strecke ein ")
    try:
        Gefahrene_strecke = float(input("Strecke in km:")) # eingabe auf Ihren Typ prüfen
        Gefahrene_strecke.replace(",",".")
        Strecke_bestimmt = True
    except:
        print("Bitte Gleitkommazahl eingeben")

# Verbrauchten Kraftstoff bestimmen
while Kraftstoffmenge_bestimmt == False:
    print("Geben Sie nun die Menge an Kraftstoff in Litern ein")
    try:
        Verbrauchte_liter = float(input("Liter:"))
        Durschnittsverbrauch_berechnen()
        Kraftstoffmenge_bestimmt = True

    except:
        print("Eingabe war nicht korrekt")

print("Ihr Durschnittsverbrauch beträgt:")
Durschnittsverbrauch_gerundet = round(Durschnittsverbrauch,2)
print(Durschnittsverbrauch_gerundet,"L/ 100Km")

Re: Eingabe der Input funktion formatieren

Verfasst: Montag 26. April 2021, 11:39
von __deets__
Das PEP8 erlaeutert wichtige Namenskonventionen in Python. Bezeichner von Variablen schreibt man klein_mit_unterstrich, KlassenInCamelCase. Du verwendest eine unglueckliche Mischung daraus.

try/except ohne *konkrete* Exception, also in diesem Fall ValueError, ist fast immer ein Fehler, weil man so auch alle anderen selbstverschuldeten Programmierfehler gleich mitschluckt.

Man vergleicht nicht mit == False oder == True, denn deren Ergebnis ist ja wieder nur False oder True. Man muesste also konsequenterweise ausdruck == False == True == True........ schreiben.

Stattdessen schreibt man einfach

Code: Alles auswählen

if ausdruck:

if not ausdruck:
Gewoehn dir gleich ab, globale Variablen zu benutzen. Die fuehren in deinem spaeteren Programmiererleben nur zu Problemen, weil man die Uebersicht verliert, was von wo benutzt und veraendert wird. Schreib eine ordentliche main-Funktion, in der alle Variablen lokal sind. Kapsele die Eingabe von floats in eine Funktion, der du den Text einfach mitgibst, und die ein erfolgreich eingegebenes float zurueckliefert. Schon hast du deine massive Code-Dopplung fuer die sichere Eingabe elimiminiert.

Und zu deinem Problem: wenn du das so anbieten willst, musst du einfach *vor* der float-Wandlung das replace durchfuehren. Und vor allem sind Strings in Python auch immutable, dein replace wie im Moment genutzt verpufft also wirkungslos.

Code: Alles auswählen

value = float(value.replace(",", "."))
waere ein kompakter Weg.

Re: Eingabe der Input funktion formatieren

Verfasst: Montag 26. April 2021, 12:16
von Sirius3
Man führt keine Variablen ein, die erst zwanzig Zeilen später gebraucht werden.
Die Initialisierung von `Gefahrene_strecke` und `Verbrauchte_liter` werden gar nicht gebraucht.
Die Flags braucht man auch nicht, weil man mit einer while-True-Schleife und break das selbe erreichen kann.
Der Kommentar ›# eingabe auf Ihren Typ prüfen‹ ist irreführend, weil gar kein Typ geprüft wird.
Das macht das ganz schon etwas übersichtlicher:

Code: Alles auswählen

def Durschnittsverbrauch_berechnen():
    global Durschnittsverbrauch
    Durschnittsverbrauch = ((Verbrauchte_liter / Gefahrene_strecke) * 100)

while True:
    print("Bitte geben sie die Gefahrene Strecke ein ")
    try:
        Gefahrene_strecke = float(input("Strecke in km:"))
        Gefahrene_strecke.replace(",",".")
        break
    except:
        print("Bitte Gleitkommazahl eingeben")

while True:
    print("Geben Sie nun die Menge an Kraftstoff in Litern ein")
    try:
        Verbrauchte_liter = float(input("Liter:"))
        Durschnittsverbrauch_berechnen()
        break
    except:
        print("Eingabe war nicht korrekt")

print("Ihr Durschnittsverbrauch beträgt:")
Durschnittsverbrauch_gerundet = round(Durschnittsverbrauch,2)
print(Durschnittsverbrauch_gerundet,"L/ 100Km")
Jetzt wandelst Du die Stecke erst in ein float um, um dann replace auf ein float anzuwenden, was es gar nicht gibt. Du mußt also zuerst das Komma in einen Punkt umwandeln und dann float aufrufen.
Man benutzt immer so konkrete Exceptions wie möglich, hier also ValueError.
Eine Funktion sollte alles über Argumente bekommen, was sie braucht und Ergebnisse per `return` zurückgeben. Gerundet wird erst bei der Ausgabe.

Code: Alles auswählen

def Durschnittsverbrauch_berechnen(Verbrauchte_liter, Gefahrene_strecke):
    return ((Verbrauchte_liter / Gefahrene_strecke) * 100)

while True:
    print("Bitte geben sie die Gefahrene Strecke ein ")
    try:
        Gefahrene_strecke = float(input("Strecke in km:").replace(",","."))
        break
    except ValueError:
        print("Bitte Gleitkommazahl eingeben")

while True:
    print("Geben Sie nun die Menge an Kraftstoff in Litern ein")
    try:
        Verbrauchte_liter = float(input("Liter:").replace(",","."))
        break
    except ValueError:
        print("Eingabe war nicht korrekt")

print("Ihr Durschnittsverbrauch beträgt:")
Durschnittsverbrauch = Durschnittsverbrauch_berechnen(Verbrauchte_liter, Gefahrene_strecke)
print(f"{Durschnittsverbrauch:.2f}L/100km")
Jetzt hast Du zweimal fast identischen Code, den man gut in eine Funktion auslagern kann.
Funktionen und Variablennamen schreibt man dabei komplett klein:

Code: Alles auswählen

def durschnittsverbrauch_berechnen(verbrauchte_liter, gefahrene_strecke):
    return ((verbrauchte_liter / gefahrene_strecke) * 100)

def zahl_eingeben(text, prompt):
    while True:
        print(text)
        try:
            return float(input(prompt).replace(",","."))
        except ValueError:
            print("Bitte Gleitkommazahl eingeben")

def main():
    gefahrene_strecke = zahl_eingeben("Bitte geben sie die Gefahrene Strecke ein ", "Strecke in km:")
    verbrauchte_liter = zahl_eingeben("Geben Sie nun die Menge an Kraftstoff in Litern ein", "Liter:")
    durschnittsverbrauch = durschnittsverbrauch_berechnen(verbrauchte_liter, gefahrene_strecke)
    print(f"Ihr Durschnittsverbrauch beträgt: {durschnittsverbrauch:.2f}L/100km")

if __name__ == '__main__':
    main()

Re: Eingabe der Input funktion formatieren

Verfasst: Montag 26. April 2021, 20:43
von iWischMob
Wow... Vielen Dank für die sicher zeitaufwendigen Beiträge.
So ein bischen Feedback konnte ich gut gebrauchen. Insbesondere die Allgemeinen Sachen sind verständlich erklärt.

Ich werde mir wohl nochmal etwas zu guter Programmierer-manier durchlesen müssen :D