@Noofuu: Bevor Du irgendetwas anderes machst solltest Du `eval()` loswerden und am besten gleich wieder vergessen, dass es das gibt. Du willst die Eingabe in eine Zahl umwandeln und nicht das der Benutzer beliebige Python-Ausdrücke eingeben kann. Das reisst eine riesige Sicherheitslücke in Programme, und wenn Du anfängst Dich um Fehlerbehandlung zu kümmern, damit das Programm bei Fehleingaben nicht einfach abbricht, dann kann bei `eval()` tatsächlich so gut wie *alles* passieren, weil der Benutzer so gut wie alles machen kann, solange es sich nur als Python-Ausdruck formulieren lässt. Bei `float()` muss man sich nur um einen eventuellen `ValueError` kümmern.
Auf Modulebene gehört nur Code der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.
Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase).
Einbuchstabige Namen sind nur in seltenen Fällen sinnvoll. Zum Beispiel bei `x` und `y` für Koordinaten, oder `i` und `j` als Laufvariablen und/oder für Indexzugriffe bei Sequenzen (`list`, `tuple`, …). Das sind Leser aus der Mathematik gewohnt. Aber das `K` für die Kalorien für eine Menge von Kartoffeln steht, ist nicht wirklich selbsterklärend. Namen sind aber genau dafür da: um dem Leser zu vermitteln was der Wert dahinter im Kontext des Programms bedeutet.
Noch schlimmer sind Namen die nicht stimmen, wie zum Beispiel `liste` für eine Zahl zu verwenden.
Warum setzt Du '\n' immer in Klammern? Die machen keinen Sinn. Zudem kann man das Zeilenende in allen Fällen wo Du das als einzelnes Argument an `print()` übergibst, auch einfach am Ende der Zeichenkette schreiben, die als Argument davor übergeben wird. Ebensowenig ist es sinnvoll 'kcal' bei der Ausgabe der Kalorien pro Lebensmittel als eigenes Argument, getrennt vom Lebensmittelnamen zu übergeben.
Man sollte ”magische” Zahlen im Code vermeiden. Für die „kcal pro Einheit Lebensmittel“-Werte würde man Konstanten definieren.
Die Restkalorien berechnet das Programm zweimal – solche Wiederholungen sollte man vermeiden.
Die Auswertung am Ende berücksichtig nicht den Fall, das man den Tagesbedarf exakt getroffen hat. Die Ausgaben die der Benutzer dann bekommt, ist nicht wirklich sinnvoll.
Zwischenstand bis hierher:
Code: Alles auswählen
#!/usr/bin/env python3
from math import isclose
KCAL_PRO_GRAMM_KARTOFFEL = 0.7
KCAL_PRO_GRAMM_THUNFISCH = 1.11
KCAL_PRO_MILLILITER_MILCH = 0.48
KCAL_PRO_GRAMM_REIS = 1.26
def main():
print('Persönlicher kcal Rechner\n')
name = input('Geben sie bitte ihren Namen ein: ')
print('Herzlich Willkommen zu ihrem persönlichen kcal-Rechner:', name)
print('\n')
tagesbedarf = float(input('Dein Tagesbedarf kcal: '))
print('\n')
kartoffel = float(input('Wieviel Gramm Kartoffeln?: '))
thunfisch = float(input('Wieviel Gramm Thunfisch?: '))
milch = float(input('Wieviel Milliliter Milch?: '))
reis = float(input('Wieviel Gramm Reis?: '))
kartoffel_kcal = kartoffel * KCAL_PRO_GRAMM_KARTOFFEL
thunfisch_kcal = thunfisch * KCAL_PRO_GRAMM_THUNFISCH
milch_kcal = milch * KCAL_PRO_MILLILITER_MILCH
reis_kcal = reis * KCAL_PRO_GRAMM_REIS
gesamt_kcal = kartoffel_kcal + thunfisch_kcal + milch_kcal + reis_kcal
rest_kcal = tagesbedarf - gesamt_kcal
print(kartoffel_kcal, 'kcal Kartoffeln\n')
print(thunfisch_kcal, 'kcal Thunfisch\n')
print(milch_kcal, 'kcal Milch\n')
print(reis_kcal, 'kcal Reis\n')
print(gesamt_kcal, 'Gesammte kcal')
print(rest_kcal, 'kcal stehen noch zur Verfügung.')
if rest_kcal < 0:
print('Achte auf deinen Maximalen Tagesbedarf, leider überschritten!')
elif isclose(rest_kcal, 0):
print('Perfekt! Ab jetzt heute nichts mehr essen.')
else:
print('Achte darauf das du den Tagesbedarf noch aufbrauchst!')
if __name__ == "__main__":
main()
Das was Du da als nächstes vorhast braucht Datenstrukturen. Du musst als erstes die Daten für die einzelnen Lebensmittel hinterlegen, also Name ('Kartoffel', …), Einheit ('Gramm', 'Milliliter', …), und Kalorienverbrauch pro Einheit. Da der Benutzer das Lebensmittel eingeben soll, und Du daraufhin die anderen beiden Werte benötigst, bietet sich ein Wörterbuch (`dict`) an, das den Lebensmittelnamen beispielsweise auf ein Tupel aus Einheit und Kalorien pro Einheit abbildet.
Um die Werte dann zu speichern bietet sich ebenfalls wieder ein Wörterbuch an, das den Lebensmittelnamen auf die Anzahl der aufgenommenen Kalorien abbildet. Eventuell auch ein `collections.defaultdict`, denn wenn der Benutzer zweimal das gleiche Lebensmittel eingibt, will man ja wahrscheinlich die neuen Daten zu den bereits eingegebenen addieren.
Du solltest dann auch Fehleingaben explizit behandeln, damit ein Vertipper nicht dazu führen kann, dass alle bisherigen Eingaben durch den Programmabbruch zunichte gemacht werden.
Und bei der Eingabe des Lebensmittel könntest Du auch überlegen ob es für den Benutzer nicht eventuell einfacher ist, wenn man ihm eine Liste von Möglichkeiten mit Nummer präsentiert, die er dann eingibt, als das er tatsächlich immer den Namen 'Kartoffel' tippen muss.
Sowohl bei der Fehlerbehandlung als auch bei einem Textmenü zur Auswahl sind wir dann beim Thema Funktionen angekommen, denn die sollte man dann schreiben, statt alles linear im Hauptprogramm runter zu hacken, potentiell auch noch mit Codewiederholungen.
Fehlerbehandlung könnte auch ein Schritt vor dem ”flexibilisieren” der Eingabe sein, also das die Zahleneingaben entsprechend abgesichert sind falls der Benutzer keine Zahl eingibt. Und in diesem Programm machen bei den gültigen Eingaben auch nur positive Zahlen Sinn – das könnte man auch bei der Eingabe berücksichtigen.