Temperatur Umrechner

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
Benutzeravatar
andie39
User
Beiträge: 152
Registriert: Dienstag 7. Dezember 2021, 16:32

So ich habe nun mein 2. Programm selbstständig mit den Möglichkeiten geschrieben die ich habe.
Für das was es machen soll sehr lang.
Die Lösung daher nicht so elegant.

Code: Alles auswählen


# Dies ist ein Konverter zur Umrechnung der Temperaturen Kelvin, Celsius und Fahrenheit


def celsius_to_fahrenheit(celsius_wert):
    result = (float(celsius_wert) * 9/5) + 32 
    print(celsius_wert + " Grad Celsius entsprechen " + str(result) + " Grad Fahrenheit")

def celsius_to_kelvin(celsius_wert):
    result = float(celsius_wert) + 273.15
    print(celsius_wert + " Grad Celsius entsprechen " + str(result) + " Grad Kelvin")

def fahrenheit_to_celsius(fahr_wert):
    result = (float(fahr_wert)-32) *5/9
    print(fahr_wert + " Grad Fahrenheit entsprechen " + str(result) + " Grad Celsius")

def fahrenheit_to_kelvin(fahr_wert):
    result = (float(fahr_wert)-32) *5/9 + 273.15
    print(fahr_wert + " Grad Fahrenheit entsprechen " + str(result) + " Grad Kelvin")
    
def kelvin_to_celsius(kelvin_wert):
    result = float(kelvin_wert)-273.15
    print(kelvin_wert + " Grad Kelvin entsprechen " + str(result) + " Grad Celsius")

def kelvin_to_fahrenheit(kelvin_wert):
    result = (float(kelvin_wert)-273.15) * 9/5 + 32
    print(kelvin_wert + " Grad Kelvin entsprechen " + str(result) + " Grad Fahrenheit")
    
def main():
	
    print("Willkommen zu 'Temp-Konv,' dem Temperatur Umrechner' von Celsius, Fahrenheit und Kelvin! \n")

    print("Bitte wählen Sie eine Umrechnungsvariante: \n\n")

    print("(1)Umrechnung: Celsius in Fahrenheit")
    print("(2)Umrechnung: Celsius in Kelvin")
    print("(3)Umrechnung: Fahrenheit in Celsius")
    print("(4)Umrechnung: Fahrenheit in Kelvin")
    print("(5)Umrechnung: Kelvin in Celsius")
    print("(6)Umrechnung: Kelvin in Fahrenheit\n")
    
    eingabe = input("Ihre Wahl: ")
   
    

    if eingabe == "1"or eingabe == "2":
        print("Wählen Sie einen Wert in Celsius")
        celsius_wert = input()
        print("Sie haben " + celsius_wert + " Grad Celsius gewählt.\n")
        if eingabe == "1":
            celsius_to_fahrenheit(celsius_wert)
        else:
            celsius_to_kelvin(celsius_wert)
    elif eingabe == "3" or eingabe == "4":
        print("Wählen Sie einen Wert in Fahrenheit")
        fahr_wert = input()
        print("Sie haben " + fahr_wert + " Grad Fahrenheit gewählt.\n")
        if eingabe == "3":
            fahrenheit_to_celsius(fahr_wert)
        else:
            fahrenheit_to_kelvin(fahr_wert)
    elif eingabe == "5" or eingabe == "6":
    	  print("Wählen Sie einen Wert in Kelvin")
    	  kelvin_wert = input()
    	  print("Sie haben " + kelvin_wert + " Grad Fahrenheit gewählt.\n")
    	  if eingabe == "5":
    	      kelvin_to_celsius(kelvin_wert)
    	  else:
    	      kelvin_to_fahrenheit(kelvin_wert)
    else:
    	  print("Falsche Eingabe")




if __name__ == "__main__":
    main()
    
    
Benutzeravatar
__blackjack__
User
Beiträge: 13071
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@andie39: Der Kelvin-Teil im Hauptprogramm ist nicht gleich tief eingerückt wie die anderen Teile. Und man erkennt da auch ganz gut, dass das per kopieren und einfügen und leicht anpassen entstanden ist, weil im Text an einer Stelle noch Fahrenheit steht, wo eigentlich Kelvin stehen müsste. (Kelvin sind übrigends keine Grad Kelvin, sondern einfach nur Kelvin.)

Das mit dem Kopieren und einfügen ist ein Warnzeichen. Da macht man in der Regel was falsches/problematisches. Es wiederholt sich da ja im Grunde dreimal das gleiche Codemuster. So etwas löst man dadurch, das man die Unterschiede als Daten heraus zieht. Der Benutzer wählt da ja im Grunde Daten aus: Quell- und Zieleinheit und ein Funktionenpaar. Und die Einheiten entscheiden sich noch mal ob sie den Zusatz Grad haben oder nicht. Wenn man diese Informationen hat, kann man den Code *einmal* schreiben:

Code: Alles auswählen

        print(f"Wählen Sie einen Wert in {quell_einheit}")
        quell_wert = input()
        grad_text = "Grad " if ist_grad_quelle else ""
        print(f"Sie haben {quell_wert} {grad_text}{quell_einheit} gewählt.\n")
        konvertierfunktion(quell_wert)
Der Code davor muss dafür sorgen, dass `quell_wert`, `ist_grad_quelle`, und `konvertierfunktion` den passenden Wert bekommen, je nach dem was der Benutzer auswählt. Das kann unter Umständen einfach durch eine Auswahl aus einer Liste oder einem Wörterbuch passieren, mit der Eingabe des Benutzers als Index/Schlüssel.

An der Aufteilung ungünstig ist auch das die Eingabe, die ja eigentlich einen Zahlwert darstellt als Zeichenkette übergeben wird und in der Rechnung erst in eine Zahl umgewandelt wird. Und normalerweise trennt man Benutzerinteraktion und Programmlogik. So eine Umrechnungsfunktion sollte mal einfach testen können in dem man ihr eine Temperatur als Zahl übergibt, und das Ergebnis als Zahl als Rückgabewert bekommt. Ob man die Funktion testet, in einer Konsolenanwendung verwendet, oder eine GUI schreibt, oder ein Programm das eine CSV-Datei einliest und hunderte von Werten nacheinander umwandelt, sollte der Funktion egal sein. Die sollte nur die eine Aufgabe lösen: von einer Temperatureinheit in eine andere wandeln.

Die Ausgabe die jetzt in den Umwandlungsfunktionen steht, ist ja letztlich auch wieder Codewiederholung, die sich nur durch Daten unterscheidet, die im Moment fest in den Zeichenketten stehen.

Eine weitere Verbesserung wäre es nicht Funktionen von jeder Einheit in jede andere zu schreiben, sondern für jede Einheit eine Umwandlung in Kelvin und von Kelvin in die Einheit. Eine Umwandlung von einer beliebigen Einheit in eine andere beliebige Einheit kann man dann über einen Zwischenwert in Kelvin ausdrücken. Der Vorteil ist, dass man, wenn man eine weitere Einheit hinzufügt, nur diese Einheit und Kelvin kennen muss, und nicht auch noch alle anderen, und in jede eine eigene Umwandlungsfunktion schreiben und testen muss. Statt Kelvin könnte man natürlich auch eine der anderen Einheiten als Basis nehmen. Ich hätte Kelvin da mit „ist SI-Basiseinheit“ begründet.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
andie39
User
Beiträge: 152
Registriert: Dienstag 7. Dezember 2021, 16:32

Hallo,

danke das ist ein schönes Beispiel zu diesem Thema:

viewtopic.php?f=1&t=53674#p398526

Dieses Programm ist so quasi rausgesprudelt, es wäre ggf anders geworden wenn ich mehr darüber nachgedacht hätte.

Ich habe online eine andere Lösung gefunden:

Code: Alles auswählen

#!/usr/bin/env python3
# -*- coding: utf8 -*-
# author: Martino Antognini (uzh)

# Wir definieren die Konstanten, die wir brauchen, um die Temperaturen umzurechnen.
# Konvention: normalerweise werden die Namen von Konstanten mit Grossbuschstaben geschrieben.
ABSOLUTER_NP_K = 0.0      # absoluter Nullpunkt in Kelvin
ABSOLUTER_NP_C = -273.15  # absoluter Nullpunkt in Celsius
ABSOLUTER_NP_F = -459.67  # absoluter Nullpunkt in Fahrenheit

NULL_F = 32.0             # 0° C in Fahrenheit
FAKTOR_F_C = 9/5          # Umrechnungsfaktor zwischen Fahrenheit und Celsius

FEHLERMELDUNG_TEMP = "*** Fehler: unmögliche Temperatur! ***"  # Fehlermeldung für ungültige Eingabe

def get_float(msg = "Bitte Zahl eingeben: "):
    while True:
        try:
            f = float(input(msg))
            return f
        except ValueError:
            print("Ops! Ungültige Eingabe. Bitte nochmals probieren: ")            
            
def Celsius_Kelvin(t):
    if t >= ABSOLUTER_NP_C:
        return t - ABSOLUTER_NP_C
    else:
        raise TypeError(FEHLERMELDUNG_TEMP) 

def Celsius_Fahrenheit(t):
    if t >= ABSOLUTER_NP_C:
        return NULL_F + FAKTOR_F_C*t
    else:
        raise TypeError(FEHLERMELDUNG_TEMP) 
            
def Kelvin_Celsius(t):
    if t >= ABSOLUTER_NP_K:
        return t + ABSOLUTER_NP_C
    else:
        raise TypeError(FEHLERMELDUNG_TEMP) 
        
def Kelvin_Fahrenheit(t):
    if t >= ABSOLUTER_NP_K:
        return t*FAKTOR_F_C + ABSOLUTER_NP_F 
    else:
        raise TypeError(FEHLERMELDUNG_TEMP) 

def Fahrenheit_Celsius(t):
    if t >= ABSOLUTER_NP_F:
        return (t - NULL_F)/FAKTOR_F_C 
    else:
        raise TypeError(FEHLERMELDUNG_TEMP) 
        
def Fahrenheit_Kelvin(t):
    if t >= ABSOLUTER_NP_F:
        return (t - ABSOLUTER_NP_F)/FAKTOR_F_C
    else:
        raise TypeError(FEHLERMELDUNG_TEMP) 

print()
print("*----------------------*")
print("* Temperatur Umwandler *")
print("*----------------------*")

wahl = -1
while wahl != 0:
    print()
    print("(1) Umrechnung von Celsius nach Kelvin")
    print("(2) Umrechnung von Celsius nach Fahrenheit")
    print("(3) Umrechnung von Kelvin nach Celsius")
    print("(4) Umrechnung von Kelvin nach Fahrenheit")
    print("(5) Umrechnung von Fahrenheit nach Celsius")
    print("(6) Umrechnung von Fahrenheit nach Kelvin")
    print()
    print("(0) Programm schliessen")
    print()
    print()
    wahl = int(input("Bitte wählen: "))
    print()
    if wahl == 1:
        t = get_float("Temperatur in Celsius: ")
        print(t, "° = ", Celsius_Kelvin(t), "K", sep = "")
    elif wahl == 2:
        t = get_float("Temperatur in Celsius: ")
        print(t, "° = ", Celsius_Fahrenheit(t), "F", sep = "")  
    elif wahl == 3:
        t = get_float("Temperatur in Kelvin: ")
        print(t, "K = ", Kelvin_Celsius(t), "°", sep = "")      
    elif wahl == 4:
        t = get_float("Temperatur in Kelvin: ")
        print(t, "K = ", Kelvin_Fahrenheit(t), "F", sep = "")   
    elif wahl == 5:
        t = get_float("Temperatur in Fahrenheit: ") 
        print(t, "F = ", Fahrenheit_Celsius(t), "°", sep = "") 
    elif wahl == 6:
        t = get_float("Temperatur in Fahrenheit: ") 
        print(t, "F = ", Fahrenheit_Kelvin(t), "K", sep = "") 
    else:
        print("Programm wird vom Benutzer beendet.")
        break
 
Ich bin nicht sicher ob ich so darauf gekommen wäre hätte ich nachgedacht, aber vielleicht.
Mein Code ist mit wenigen Anfangs"fähigkeiten" geschrieben.

Im Moment versuche ich anhand von einigen Pythonista Beispiel Codes diese zu verstehen.

Ist das hier im Forum eigentlich ok?
Über einen Beispielcode den es online gibt zu diskutieren bzw ob das Verständnis korrekt ist oder eben nicht?
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

@andie39: die Konvertierungsfunktionen müssen zuerst richtige Funktionen werden, also welche, die nur die Aufgabe haben, Temperaturen umzurechnen. Die Ausgabe erfolgt im Hauptprogramm:

Code: Alles auswählen

def celsius_to_fahrenheit(celsius_wert):
    return (celsius_wert * 9/5) + 32

def celsius_to_kelvin(celsius_wert):
    return celsius_wert + 273.15

def fahrenheit_to_celsius(fahr_wert):
    return (fahr_wert-32) *5/9

def fahrenheit_to_kelvin(fahr_wert):
    return (fahr_wert-32) *5/9 + 273.15
    
def kelvin_to_celsius(kelvin_wert):
    return kelvin_wert - 273.15

def kelvin_to_fahrenheit(kelvin_wert):
    return (kelvin_wert - 273.15) * 9/5 + 32
    
def main():
    print("Willkommen zu 'Temp-Konv,' dem Temperatur Umrechner' von Celsius, Fahrenheit und Kelvin! \n")
    print("Bitte wählen Sie eine Umrechnungsvariante: \n\n")
    print("(1)Umrechnung: Celsius in Fahrenheit")
    print("(2)Umrechnung: Celsius in Kelvin")
    print("(3)Umrechnung: Fahrenheit in Celsius")
    print("(4)Umrechnung: Fahrenheit in Kelvin")
    print("(5)Umrechnung: Kelvin in Celsius")
    print("(6)Umrechnung: Kelvin in Fahrenheit\n")
    
    eingabe = input("Ihre Wahl: ")
    if eingabe == "1" or eingabe == "2":
        print("Wählen Sie einen Wert in Celsius")
        celsius_wert = float(input())
        print(f"Sie haben {celsius_wert}°C gewählt.\n")
        if eingabe == "1":
            result = celsius_to_fahrenheit(celsius_wert)
            print(f"{celsius_wert}°C entsprechen {result}°F")
        else:
            result = celsius_to_kelvin(celsius_wert)
            print(f"{celsius_wert}°C entsprechen {result}K")
    elif eingabe == "3" or eingabe == "4":
        print("Wählen Sie einen Wert in Fahrenheit")
        fahr_wert = float(input())
        print(f"Sie haben {fahr_wert}°F gewählt.\n")
        if eingabe == "3":
            result = fahrenheit_to_celsius(fahr_wert)
            print(f"{fahr_wert}°F entsprechen {result}°C")
        else:
            result = fahrenheit_to_kelvin(fahr_wert)
            print(f"{fahr_wert}°F entsprechen {result}K")
    elif eingabe == "5" or eingabe == "6":
        print("Wählen Sie einen Wert in Kelvin")
        kelvin_wert = float(input())
        print(f"Sie haben {kelvin_wert}°F gewählt.\n")
        if eingabe == "5":
            result = kelvin_to_celsius(kelvin_wert)
            print(f"{kelvin_wert}K entsprechen {result}°C")
        else:
            result = kelvin_to_fahrenheit(kelvin_wert)
            print(f"{kelvin_wert}K entsprechen {result}°F")
    else:
        print("Falsche Eingabe")


if __name__ == "__main__":
    main()
Jetzt sind im Hauptprogramm viele fast identische Codezeilen, die man am besten in eine Funktion auslagert:

Code: Alles auswählen

def convert(title, from_unit, to_unit, calculate):
    print(f"Wählen Sie einen Wert in {title}")
    wert = float(input())
    print(f"Sie haben {wert}{from_unit} gewählt.\n")
    result = calculate(wert)
    print(f"{wert}{from_unit} entsprechen {result}{to_unit}")


def main():
    print("Willkommen zu 'Temp-Konv,' dem Temperatur Umrechner' von Celsius, Fahrenheit und Kelvin! \n")
    print("Bitte wählen Sie eine Umrechnungsvariante: \n\n")
    print("(1)Umrechnung: Celsius in Fahrenheit")
    print("(2)Umrechnung: Celsius in Kelvin")
    print("(3)Umrechnung: Fahrenheit in Celsius")
    print("(4)Umrechnung: Fahrenheit in Kelvin")
    print("(5)Umrechnung: Kelvin in Celsius")
    print("(6)Umrechnung: Kelvin in Fahrenheit\n")
    
    eingabe = input("Ihre Wahl: ")
    if eingabe == "1":
        convert("Celsius", "°C", "°F", celsius_to_fahrenheit)
    elif eingabe == "2":
        convert("Celsius", "°C", "K", celsius_to_kelvin)
    elif eingabe == "3":
        convert("Fahrenheit", "°F", "°C", fahrenheit_to_celsius)
    elif eingabe == "4":
        convert("Fahrenheit", "°F", "K", fahrenheit_to_kelvin)
    elif eingabe == "5":
        convert("Kelvin", "K", "°C", kelvin_to_celsius)
    elif eingabe == "6":
        convert("Kelvin", "K", "°F", kelvin_to_fahrenheit)
    else:
        print("Falsche Eingabe")
Dann kann man noch die Daten in passende Strukturen packen:

Code: Alles auswählen

NAME_TO_UNIT = {
    "Celsius": "°C",
    "Fahrenheit": "°F",
    "Kelvin": "K",
}

CALCULATIONS = [
    ("Celsius", "Fahrenheit", celsius_to_fahrenheit),
    ("Celsius", "Kelvin", celsius_to_kelvin),
    ("Fahrenheit", "Celsius", fahrenheit_to_celsius),
    ("Fahrenheit", "Kelvin", fahrenheit_to_kelvin),
    ("Kelvin", "Celsius", kelvin_to_celsius),
    ("Kelvin", "Fahrenheit", kelvin_to_fahrenheit),
]

def convert(from_unit, to_unit, calculate):
    print(f"Wählen Sie einen Wert in {from_unit}")
    wert = float(input())
    print(f"Sie haben {wert}{NAME_TO_UNIT[from_unit]} gewählt.\n")
    result = calculate(wert)
    print(f"{wert}{NAME_TO_UNIT[from_unit]} entsprechen {result}{NAME_TO_UNIT[to_unit]}")


def main():
    print("Willkommen zu 'Temp-Konv,' dem Temperatur Umrechner' von Celsius, Fahrenheit und Kelvin! \n")
    print("Bitte wählen Sie eine Umrechnungsvariante: \n\n")
    for i, (from_unit, to_unit, _) in enumerate(CALCULATIONS, 1):
        print("({i})Umrechnung: {from_unit} in {to_unit}")
    
    eingabe = int(input("Ihre Wahl: ")) - 1
    if 0 <= eingabe < len(CALCULATIONS):
        convert(*CALCULATIONS[eingabe])
    else:
        print("Falsche Eingabe")
Benutzeravatar
__blackjack__
User
Beiträge: 13071
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@andie39: Die Frage ist nicht ob Du durch mehr vorherige Planung gleich zu so einem Endergebnis kommst. Das was hier gerade passiert ist Teil vom normalen Entwicklungsprozess, dass man ein Programm oder Teile davon geschrieben hat und das dann anschaut und sich denkt, da sind Gemeinsamkeiten die man als Daten und/oder Funktionen heraus ziehen kann, oder Daten die man statt sie wie bisher einzeln an Namen zu binden, auch zu einem Objekt zusammenfassen könnte. Oder Code der nicht so leicht zu verstehen ist, der sich vielleicht besser verständlich formulieren liesse.

Dein Ziel sollte nicht sein Planen so gut zu üben das Du das Endergebnis im Beitrag von Sirius3 direkt so 1:1 planen könntest. Das ist unrealistisch, weil Du letztlich die Verfeinerungen und Verbesserungen dann in der Planungsphase machen würdest/müsstest. Das ist aber deutlich schwieriger, denn im Gegensatz zum Programm kannst Du die Planung nicht ausführen und praktische Probleme direkt feststellen und in der weiteren Planung berücksichtigen.

Ein erfahrener Programmierer hätte die letzte Iteration aus dem Beitrag von Sirius3 wahrscheinlich tatsächlich gleich so geschrieben. Weil er durch Erfahrung ein Auge/Gespür dafür hat, was Daten sind, die man besser nicht durch Code ausdrückt beziehungsweise hart in den Code schreibt, sondern besser in eine Datenstruktur steckt. Das lernt man aber nicht durch Planung, sondern in dem man solche Umformungen von Code schon ein paar mal gemacht hat, und sich deshalb den Schritt spart und es gleich etwas flexibler schreibt, mit weniger Code und mehr Daten. Das lernt man durch Programmieren. Sich den eigenen Code kritisch anschauen, erfahrene Programmierer drüber schauen lassen, und Code überarbeiten, umschreiben, und auch wegwerfen und neu schreiben.

Es ist eine völlig normale Sache, auch für erfahrene Programmierer, das man sich Code anschaut, den man selbst vor einiger Zeit geschrieben hat, und einem Sachen ins Auge fallen, die man mittlerweile anders lösen würde. Weil man weitere Erfahrungen gesammelt hat, beispielsweise wie man ein Problem/eine Lösung auch anders sehen und formulieren kann. Dabei können auch Änderungen/Neuerungen bei der Programmiersprache oder bei Bibliotheken eine Rolle spielen. Oder man hat eine weitere Programmiersprache gelernt, oder zumindest mal reingeschnuppert. Sowohl Haskell als auch Java haben nachhaltig verändert wie ich Programme in C schreibe, weil nach funktionaler und objektorientierter Programmierer der Blick auf Datenstrukturen und Funktionen einfach ein anderer ist. Nach objektorientierter Programmierung denke ich mehr an Funktionen die *zu* bestimmten Datenstrukturen gehören, und nach funktionaler Programmierung ist die Funktion als Wert für mich deutlich eher eine Option als das vorher der Fall war. Bei Python ist schön, dass man da von Sprache und Standardbibliothek prozedurale, funktionale, und objektorientierte Werkzeuge an die Hand bekommt, und die nach Bedarf kombinieren kann.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
andie39
User
Beiträge: 152
Registriert: Dienstag 7. Dezember 2021, 16:32

Verstehe.

Naja wenigstens funktionieren meine Programme schon grundsätzlich.
Dafür das ich erst vor wenigen Tagen begonnen habe……

Ein professioneller Programmierer, dass wird auch nicht möglich sein.

Aber wenn ich mir für die Arbeit mal etwas schreiben kann oder mehr verstehe bzw mir persönlich ein kleines Programm erstellen kann wäre das ja schon gut.

@Sirius: Danke für den ausführlichen Code den schaue ich mir heute Abend mal an.
Benutzeravatar
andie39
User
Beiträge: 152
Registriert: Dienstag 7. Dezember 2021, 16:32

Sirius3 hat geschrieben: Montag 20. Dezember 2021, 19:57 @andie39: die Konvertierungsfunktionen müssen zuerst richtige Funktionen werden, also welche, die nur die Aufgabe haben, Temperaturen umzurechnen. Die Ausgabe erfolgt im Hauptprogramm:

Code: Alles auswählen

def celsius_to_fahrenheit(celsius_wert):
    return (celsius_wert * 9/5) + 32

def celsius_to_kelvin(celsius_wert):
    return celsius_wert + 273.15

def fahrenheit_to_celsius(fahr_wert):
    return (fahr_wert-32) *5/9

def fahrenheit_to_kelvin(fahr_wert):
    return (fahr_wert-32) *5/9 + 273.15
    
def kelvin_to_celsius(kelvin_wert):
    return kelvin_wert - 273.15

def kelvin_to_fahrenheit(kelvin_wert):
    return (kelvin_wert - 273.15) * 9/5 + 32
    
def main():
    print("Willkommen zu 'Temp-Konv,' dem Temperatur Umrechner' von Celsius, Fahrenheit und Kelvin! \n")
    print("Bitte wählen Sie eine Umrechnungsvariante: \n\n")
    print("(1)Umrechnung: Celsius in Fahrenheit")
    print("(2)Umrechnung: Celsius in Kelvin")
    print("(3)Umrechnung: Fahrenheit in Celsius")
    print("(4)Umrechnung: Fahrenheit in Kelvin")
    print("(5)Umrechnung: Kelvin in Celsius")
    print("(6)Umrechnung: Kelvin in Fahrenheit\n")
    
    eingabe = input("Ihre Wahl: ")
    if eingabe == "1" or eingabe == "2":
        print("Wählen Sie einen Wert in Celsius")
        celsius_wert = float(input())
        print(f"Sie haben {celsius_wert}°C gewählt.\n")
        if eingabe == "1":
            result = celsius_to_fahrenheit(celsius_wert)
            print(f"{celsius_wert}°C entsprechen {result}°F")
        else:
            result = celsius_to_kelvin(celsius_wert)
            print(f"{celsius_wert}°C entsprechen {result}K")
    elif eingabe == "3" or eingabe == "4":
        print("Wählen Sie einen Wert in Fahrenheit")
        fahr_wert = float(input())
        print(f"Sie haben {fahr_wert}°F gewählt.\n")
        if eingabe == "3":
            result = fahrenheit_to_celsius(fahr_wert)
            print(f"{fahr_wert}°F entsprechen {result}°C")
        else:
            result = fahrenheit_to_kelvin(fahr_wert)
            print(f"{fahr_wert}°F entsprechen {result}K")
    elif eingabe == "5" or eingabe == "6":
        print("Wählen Sie einen Wert in Kelvin")
        kelvin_wert = float(input())
        print(f"Sie haben {kelvin_wert}°F gewählt.\n")
        if eingabe == "5":
            result = kelvin_to_celsius(kelvin_wert)
            print(f"{kelvin_wert}K entsprechen {result}°C")
        else:
            result = kelvin_to_fahrenheit(kelvin_wert)
            print(f"{kelvin_wert}K entsprechen {result}°F")
    else:
        print("Falsche Eingabe")


if __name__ == "__main__":
    main()
Jetzt sind im Hauptprogramm viele fast identische Codezeilen, die man am besten in eine Funktion auslagert:

Code: Alles auswählen

def convert(title, from_unit, to_unit, calculate):
    print(f"Wählen Sie einen Wert in {title}")
    wert = float(input())
    print(f"Sie haben {wert}{from_unit} gewählt.\n")
    result = calculate(wert)
    print(f"{wert}{from_unit} entsprechen {result}{to_unit}")


def main():
    print("Willkommen zu 'Temp-Konv,' dem Temperatur Umrechner' von Celsius, Fahrenheit und Kelvin! \n")
    print("Bitte wählen Sie eine Umrechnungsvariante: \n\n")
    print("(1)Umrechnung: Celsius in Fahrenheit")
    print("(2)Umrechnung: Celsius in Kelvin")
    print("(3)Umrechnung: Fahrenheit in Celsius")
    print("(4)Umrechnung: Fahrenheit in Kelvin")
    print("(5)Umrechnung: Kelvin in Celsius")
    print("(6)Umrechnung: Kelvin in Fahrenheit\n")
    
    eingabe = input("Ihre Wahl: ")
    if eingabe == "1":
        convert("Celsius", "°C", "°F", celsius_to_fahrenheit)
    elif eingabe == "2":
        convert("Celsius", "°C", "K", celsius_to_kelvin)
    elif eingabe == "3":
        convert("Fahrenheit", "°F", "°C", fahrenheit_to_celsius)
    elif eingabe == "4":
        convert("Fahrenheit", "°F", "K", fahrenheit_to_kelvin)
    elif eingabe == "5":
        convert("Kelvin", "K", "°C", kelvin_to_celsius)
    elif eingabe == "6":
        convert("Kelvin", "K", "°F", kelvin_to_fahrenheit)
    else:
        print("Falsche Eingabe")
Dann kann man noch die Daten in passende Strukturen packen:

Code: Alles auswählen

NAME_TO_UNIT = {
    "Celsius": "°C",
    "Fahrenheit": "°F",
    "Kelvin": "K",
}

CALCULATIONS = [
    ("Celsius", "Fahrenheit", celsius_to_fahrenheit),
    ("Celsius", "Kelvin", celsius_to_kelvin),
    ("Fahrenheit", "Celsius", fahrenheit_to_celsius),
    ("Fahrenheit", "Kelvin", fahrenheit_to_kelvin),
    ("Kelvin", "Celsius", kelvin_to_celsius),
    ("Kelvin", "Fahrenheit", kelvin_to_fahrenheit),
]

def convert(from_unit, to_unit, calculate):
    print(f"Wählen Sie einen Wert in {from_unit}")
    wert = float(input())
    print(f"Sie haben {wert}{NAME_TO_UNIT[from_unit]} gewählt.\n")
    result = calculate(wert)
    print(f"{wert}{NAME_TO_UNIT[from_unit]} entsprechen {result}{NAME_TO_UNIT[to_unit]}")


def main():
    print("Willkommen zu 'Temp-Konv,' dem Temperatur Umrechner' von Celsius, Fahrenheit und Kelvin! \n")
    print("Bitte wählen Sie eine Umrechnungsvariante: \n\n")
    for i, (from_unit, to_unit, _) in enumerate(CALCULATIONS, 1):
        print("({i})Umrechnung: {from_unit} in {to_unit}")
    
    eingabe = int(input("Ihre Wahl: ")) - 1
    if 0 <= eingabe < len(CALCULATIONS):
        convert(*CALCULATIONS[eingabe])
    else:
        print("Falsche Eingabe")
Hab es mir abgesehen und verstanden. Das macht so mehr Sinn.
Antworten