@jtschoch: Da besteht aber noch *viel* Verbesserungsbedarf.
Von der Form her ist zu weit eingerückt. Per Konvention verwendet man vier Leerzeichen pro Ebene und nicht acht. Dann sind vielleicht auch einige Zeilen, die jetzt zu lang sind, auch unter 80 Zeichen ohne dass man sie umbrechen muss.
Der Umweg über `neue_zinsen` ist überflüssig, genau wie das umwandeln einer Gleitkommazahl in eine Gleitkommazahl.
Du bist eigentlich schon lange genug dabei um Funktionen kennengelernt zu haben. Alles auf Modulebene was keine Konstanten sind, sollte in Funktionen verschwinden. Mehrzahl wohlgemerkt, denn das ist deutlich zu viel Komplexität und zu viele Namen für *eine* Funktion. Da sind 153 Anweisungen in 33 Verzweigungen und es werden 31 verschiedene Namen verwendet. Das ist zu viel um den Überblick zu behalten.
Ausführlich getestet hast Du es anscheinend nicht, sonst wäre aufgefallen, dass der Name `zahlung`, der in in Zeile 123 verwendet wird, nirgends an einen Wert gebunden wurde.
Deine Bank funktioniert nicht konsistent weil Du die Namen `bank` und `bankkonto` verwendest. `bank` ist aber immer an 0 gebunden weil im Programm `bankkonto` manipuliert, aber `bank` beim speichern und laden des Spielstands verwendet wird.
Einige Namen sind auch schlecht gewählt. Zum Beispiel `bank`. Da würde man ein Objekt erwarten, welches eine Bank repräsentiert. Und bei `brot` und `wasser` kommt man auch nicht darauf dass diese Namen so etwas wie den *Nährwert* von diesen beiden Nahrungsmitteln repräsentieren soll. `zinsen` sollte eher `zinssatz` heissen.
Der Name `ereignisse` ist ein wenig zu allgemein, da es nur verbrauchte Arbeitsstunden erfasst. Ausserdem glaube ich nicht, dass das zuverlässig funktioniert was Du da machst, denn den Wert sollte der Anwender nicht unter 0 bekommen können. Und wenn er negativ ist, kann man auch 10 Stunden arbeiten gehen. Und zwar wiederholt.
Bei den Waren die Namen und Preise auf verschiedene Bezeichner zu verteilen ist unübersichtlich. Wenn Daten zusammen gehören, sollte man sie auch in *einer* Datenstruktur speichern. Und wenn man verschiedene gleichartige Datenstrukturen hat, sollte man diese auch wieder zu einer Datenstruktur zusammen fassen, und nicht an verschiedene Namen binden. Bei der Programmkomplexität bieten sich dafür IMHO schon eigene Klassen an. Man sollte aber mindestens Wörterbücher verwenden. Schau Dir einfach mal den Aufwand an, den man betreiben muss, wenn man Dein Programm um sagen wir mal Hamburger und Bier erweitern möchte. Dafür sollte man nur an *einer* Stelle im Programm eine Datenstruktur erweitern müssen und nicht wie bei Dir im ganzen Programm suchen müssen wo die Namen `wasser` und `brot` auftauchen um dort das Programm durch Code zu erweitern.
An den Namen `liste` bindest Du eine Zeichenkette. Sehr verwirrend.
Die Haupt-``while``-Schleife hat einen ``else``-Zweig, enthält aber gar kein ``break``. Damit ist das ``else`` überflüssig und man könnte den Inhalt davon einfach hinter die Schliefe schreiben. Das ``print False`` erscheint mir aber sowieso etwas sinnfrei!?
Bei der Bank kann man nur einzahlen, aber nichts abheben!? Da würde ich kein Konto eröffnen.
Beim Zweig für das Einkaufen ist Programmieren durch kopieren und einfügen verwendet worden. Solche Wiederholungen sollte man vermeiden, denn wenn man etwas ändern will, muss man immer daran denken die Änderung an allen Kopien vorzunehmen. Genau hier ist ja dann auch der Fehler mit `zahlung` passiert. Ausserdem kommen hier auch redundante Daten vor. Wenn man die Preise ändern will, muss man das an zwei weit auseinander liegenden Stellen, in verschiedenen Formen, aber zueinander passend tun. Das ist eine unnötige Fehlerquelle.
Ein ``else: None`` ist überflüssig.
Beim Laden verwendest Du ``with`` beim Speichern aber nicht!? Ausserdem schliesst Du nach dem Speichern die Datei immer noch nicht. Einfach nur ``f.close`` hat keinen Effekt — Du musst die Methode auch *aufrufen*. Oder eben ``with`` verwenden.