Guten Tag,
und zwar soll ich einen Temperaturumrechner mit python machen, aber nicht wie es im Internet überall steht mit input, sondern wor sollen über eine Datei mit Celsius und Fahrenheit Werten in Kelvin umrechnen. Hier die Aufgabenstellung :Die Datei temperatures.txt enthält Temperaturen in Celsius (enden mit C) und in Fahrenheit (enden mit F). Schreiben Sie ein Programm, das die Temperaturen in Kelvin umwandelt: 𝑇𝐾=𝑇𝐶+273.15 und 𝑇𝐾=(𝑇𝐹+459.67)⋅5/9 ; und dann zeilenweise auf zwei Stellen gerundet ausgibt. Die ersten Zeilen der Ausgabe sind:297.27 306.5 305.58 285.39 293.0 268.36
Dies ist mein Ansatz:
f = open("temperatures.txt", encoding="utf-8")
text = f.read()
f.close()
def convert_f():
f = float(fahrenheit)
f = 𝑇𝐹+459.67)⋅5/9
return(f)
def convert_c():
c = float(celsius)
c = 𝑇𝐶+273.15
return(c)
l = []
for number in text.split():
number = float(number)
l.append(float(number)
print(l)
Mein erstes Problem liegt darin, dass ich nicht mit den Werten rechnen kann, da ich diese nur als string habe und sie irgendwie nicht in floats konvertieren kann.
Temperaturumrechner
"Irgendwie" ist keine gute Fehlerbeschreibung. Gibt es eine Fehlermeldung? Wenn ja, welche?
Der Code funktioniert gar nicht, weil er illegale Zeichen enthält und Klammern fehlen.
Funktionen brauchen Parameter, sonst ist fahrenheit oder celsius gar nicht definiert.
`return` ist keine Funktion, die Klammern gehören also weg.
`l` oder `f` sind schlechte Variablennamen. Sie sollten aussagekräftig sein, einbuchstabige Namen sind das aber nie.
Der Code funktioniert gar nicht, weil er illegale Zeichen enthält und Klammern fehlen.
Funktionen brauchen Parameter, sonst ist fahrenheit oder celsius gar nicht definiert.
`return` ist keine Funktion, die Klammern gehören also weg.
`l` oder `f` sind schlechte Variablennamen. Sie sollten aussagekräftig sein, einbuchstabige Namen sind das aber nie.
- __blackjack__
- User
- Beiträge: 13116
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@Astenbein: In den Konvertierungsfunktionen sollte kein `float()`-Aufruf mehr vorkommen, die sollten schon Zahlen als Argument(e) bekommen. Und es macht auch keinen Sinn `float()` zwei mal hintereinander anzuwenden. Eine Gleitkommazahl wird nicht ”zahliger” je öfter man `float()` aufruft.
Die Kovertierungsfunktionen haben dann auch nur eine Zeile und man bindet das Ergebnis nicht erst an einen Namen. Vorteil: Man kann dann auch keinen schlechten Namen wählen wenn man gar keinen hat.
Alles sollte in Funktionen stehen. Und insbesondere sollte man nicht Code vom Hauptprogramm und Funktionsdefinitionen vermischen. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.
Ich würde nicht die gesamte Datei auf einmal einlesen — man kann über die einzelnen Zeilen eines Dateiobjekts iterieren, zum Beispiel in einer ``for``-Schleife. Oder man sollte zumindest beim einlesen schon die Zeilen in eine Liste einlesen in dem man einfach `list()` mit dem Dateiobjekt aufruft.
Beim öffnen von Dateien sollte die ``with``-Anweisung verwendet werden wenn das möglich ist. Hier ist das möglich.
Du sagst Du kannst die Zeichenketten nicht in Zahlen umwandeln — was hättest Du denn erwartet was passiert wenn Du eine Zahldarstellung mit irgendeinen Buchstaben dahinter in eine Zahl umwandelst?
Die Kovertierungsfunktionen haben dann auch nur eine Zeile und man bindet das Ergebnis nicht erst an einen Namen. Vorteil: Man kann dann auch keinen schlechten Namen wählen wenn man gar keinen hat.
Alles sollte in Funktionen stehen. Und insbesondere sollte man nicht Code vom Hauptprogramm und Funktionsdefinitionen vermischen. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.
Ich würde nicht die gesamte Datei auf einmal einlesen — man kann über die einzelnen Zeilen eines Dateiobjekts iterieren, zum Beispiel in einer ``for``-Schleife. Oder man sollte zumindest beim einlesen schon die Zeilen in eine Liste einlesen in dem man einfach `list()` mit dem Dateiobjekt aufruft.
Beim öffnen von Dateien sollte die ``with``-Anweisung verwendet werden wenn das möglich ist. Hier ist das möglich.
Du sagst Du kannst die Zeichenketten nicht in Zahlen umwandeln — was hättest Du denn erwartet was passiert wenn Du eine Zahldarstellung mit irgendeinen Buchstaben dahinter in eine Zahl umwandelst?
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Wenn die Datei so aussieht:
Würde ich das so lösen:
Die Ausgabe:
Code: Alles auswählen
10.456C
22.134C
33.7C
10.456F
22.134F
33.7F
Code: Alles auswählen
with open("temperatures.txt", "r") as temp_file:
# Alle Zeilen der Datei in eine Liste einlesen
lines = temp_file.readlines()
# über alle Zeilen der Liste iterieren
for line in lines:
# \n vom Ende der Zeile
line = line.strip("\n")
# all Zeichen bis auf des letzt sind die Temperaturangabe
temperatur = line[:-1]
# string in float umwandeln
temperatur = float(temperatur)
# die Einheit ist das letzte Zeichen einer Zeile
einheit = line[-1]
# Fallunterscheidung ob Celsius oder Fahrenheit
if einheit == 'C':
𝑇𝐾 = temperatur + 273.15
if einheit == 'F':
𝑇𝐾 = (temperatur + 459.67) *5 / 9
# Ausgabe auf zwei Stellen gerundet
print("Temperatur: {0:6.2f}K".format(TK))
Code: Alles auswählen
Temperatur: 283.61K
Temperatur: 295.28K
Temperatur: 295.28K
Temperatur: 261.18K
Temperatur: 267.67K
Temperatur: 274.09K
- __blackjack__
- User
- Beiträge: 13116
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@rogerb: Ich würde das einlesen in eine Liste wie gesagt nicht machen. Man kann stattdessen direkt über das geöffnete Dateiobjekt iterieren.
Beim `strip()` würde ich kein Argument angeben. Das ist dann robuster gegen eventuelle Leerzeichen oder falls es da noch "\r"-Zeichen am Zeilenende geben sollte.
Falls weder ein C noch ein F nach der Zahl steht, arbeitet das Programm fehlerhaft. Falls das nach der ersten Zeile passiert, merkt der Benutzer das vielleicht nicht einmal!
Da `einheit` nicht gleichzeitig "C" *und* "F" sein kann, sollte das zweite ``if`` ein ``elif`` sein. Und wenn so ein Konstrukt mit einem ``elif`` endet, sollte man entweder noch ein ``else`` dazu schreiben das den Fall behandelt das vorher keine Bedingung gegriffen hat, oder mit einem Kommentar begründen warum es okay ist den Fall einfach zu ignorieren. Da es hier ein Fehler in den Eingabedaten wäre, sollte man es nicht ignorieren.
Die Kommentare sind alle überflüssig. Ausgenommen vielleicht den bei der Fallunterscheidung, aber auch nur wenn da die Umrechnung direkt gemacht wird und nicht Funktionen aufgerufen werden, an deren Namen man die Information ablesen kann.
Beim `strip()` würde ich kein Argument angeben. Das ist dann robuster gegen eventuelle Leerzeichen oder falls es da noch "\r"-Zeichen am Zeilenende geben sollte.
Falls weder ein C noch ein F nach der Zahl steht, arbeitet das Programm fehlerhaft. Falls das nach der ersten Zeile passiert, merkt der Benutzer das vielleicht nicht einmal!
Da `einheit` nicht gleichzeitig "C" *und* "F" sein kann, sollte das zweite ``if`` ein ``elif`` sein. Und wenn so ein Konstrukt mit einem ``elif`` endet, sollte man entweder noch ein ``else`` dazu schreiben das den Fall behandelt das vorher keine Bedingung gegriffen hat, oder mit einem Kommentar begründen warum es okay ist den Fall einfach zu ignorieren. Da es hier ein Fehler in den Eingabedaten wäre, sollte man es nicht ignorieren.
Die Kommentare sind alle überflüssig. Ausgenommen vielleicht den bei der Fallunterscheidung, aber auch nur wenn da die Umrechnung direkt gemacht wird und nicht Funktionen aufgerufen werden, an deren Namen man die Information ablesen kann.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Hallo /me
die kursiven Variablennamen werden nur im Browser so angezeigt und weil ich es aus der Aufgabenstellung kopiert habe. Man sollte natürlich aussagekräftigigere Namen verwenden, aber um den Bezug zur Frage herzustellen habe ich die gleichen wie dort verwendet.
die kursiven Variablennamen werden nur im Browser so angezeigt und weil ich es aus der Aufgabenstellung kopiert habe. Man sollte natürlich aussagekräftigigere Namen verwenden, aber um den Bezug zur Frage herzustellen habe ich die gleichen wie dort verwendet.
- __blackjack__
- User
- Beiträge: 13116
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@rogerb: Die kursiven mathematischen Grossbuchstaben werden bei mir nicht nur im Browser so dargestellt. Was ich interessant finde ist das Python da ”normale” Zeichen draus macht. Ich hätte da ja einen `NameError` erwartet wenn man 𝐴 etwas zuweist und dann auf A zugreift:
Faszinierend!
Code: Alles auswählen
In [17]: 𝐴 = 42
In [18]: A
Out[18]: 42
In [19]: who
A df pd
In [20]: 𝐴
Out[20]: 42
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Identifiers werden in Python NFKC-normalisiert. Und da ein kursives A ein A ist wird daraus A.