@#96*7*: Noch ein paar Anmerkungen zum bisherigen Quelltext:
Namen sollten dem Leser verraten was der Wert dahinter im Kontext des Programms bedeutet. Das ist bei `a` ganz sicher nicht der Fall.
Die `quit()`-Funktion sollte nicht in Programmen verwendet werden. Die ist für das beenden einer interaktiven Shell gedacht. Die Dokumentation sagt dazu:
Die Formatierung des Quelltextes weicht von dem Richtlinien im
Style Guide for Python Code ab. Insbesondere die Einrücktiefe sollte man beachten, aber auch die Leerzeichensetzung um Operatoren und Interpunktion, die der besseren Lesbarkeit dienen.
Eine Liste mit Nullen für `needed_coins` könnte man mit der Multiplikation auf Listen kürzer schreiben: ``[0] * len(coins)``. Aber dieses vorbelegen einer Liste mit Dummywerten, die dann in einer Schleife mittels Indexzugriff nacheinander durch den tatsächlich benötigten Wert ersetzt werden, ist kein idiomatisches Python. Man würde hier mit einer leeren Liste beginnen und die Werte dort mit der `append()`-Methode anhängen.
Ebenfalls ein „anti pattern” ist ``for i in range(len(sequence)):`` um dann `i` als Index für den Zugriff auf die Elemente von `sequence` zu verwenden. Man kann in Python *direkt* über die Elemente iterieren, ohne den unnötigen Umweg über einen Index. Sollte man *zusätzlich* einen Index benötigen, gibt es die `enumerate()`-Funktion. Und wenn man ”parallel” über die Werte von mehr als einer Sequenz iterieren möchte, gibt es `zip()` beziehungsweise `itertools.izip()`.
Wenn man in `needed_coins` nur die Anzahl speichert, hat man am Ende zwei parallele Listen bei denen Elemente mit dem gleichen Index zusammen gehören. So etwas sollte man vermeiden, weil es das Programm komplexer und fehleranfälliger macht. Man könnte in der Liste Tupel mit (Anzahl, Wert) der benötigten Münzen speichern.
Das Programm sähe dann in etwas „pythonischer” so aus:
Code: Alles auswählen
#!/usr/bin/env python
# coding: utf8
COIN_VALUES = [2, 1, 0.5, 0.2, 0.1, 0.05, 0.02, 0.01]
def main():
amount = float(raw_input('Bitte einen Euro-Betrag eingeben!\n'))
if (amount * 1000) % 10 != 0:
print 'Bitte maximal 2 Nachkommastellen eingeben!'
else:
needed_coins = list()
for coin_value in COIN_VALUES:
count = int(amount // coin_value)
if count:
needed_coins.append((count, coin_value))
amount -= count * coin_value
print 'Brauche', count, 'x', coin_value, 'Euro'
print needed_coins
if __name__ == '__main__':
main()
Es hat natürlich immer noch das Problem mit der Ungenauigkeit von Gleitkommazahlen im Rechner.
Und die Ausgabe entspricht nicht der Aufgabenstellung, welche die Anzahl der Münzen insgesamt fordert. Die Beispielausgabe sieht nach Python 3 aus, denn in Python 2 sähe der € anders aus wenn man einfach so eine Liste mit Zeichenketten (egal ob `str` oder `unicode`) mit ``print`` ausgibt. Da müsste man sich in Python 2 etwas mehr Mühe geben und den Inhalt der Liste in eine Zeichenkette mit durch Kommas getrennten Werten umwandeln. Etwas was man IMHO auch in Python 3 hätte tun sollen, denn Listen sind nicht wirklich zur Anzeige für den Endbenutzer gedacht. IMHO.
Was Du ansonsten noch machen könntest, wäre das Problem auf Funktionen aufteilen. Eine übliche, grobe Aufteilung ist immer die Eingabe, die Verarbeitung, und die Ausgabe zu trennen.