Derselbe Artikel zweimal
Der Kunde möchte noch zwei Packungen Milch: artikel_hinzufuegen(warenkorb, "Milch", 2, 2). Dein Programm setzt eine zweite Milchzeile auf den Kassenbon. Das ist nicht falsch, aber ein echter Shop würde einfach die Menge in der schon vorhandenen Zeile ändern: Milch: 6 x 2 € = 12 €.
Bevor artikel_hinzufuegen() einen neuen Artikel anhängt, muss es also in der Liste nach einem Artikel mit demselben Namen suchen. So findest du ein Dictionary in einer Liste und änderst es:
buecher = [
{"titel": "Der Hobbit", "seiten": 310},
{"titel": "Matilda", "seiten": 240},
]
for buch in buecher:
if buch["titel"] == "Matilda":
buch["seiten"] += 10
print(buecher)[{'titel': 'Der Hobbit', 'seiten': 310}, {'titel': 'Matilda', 'seiten': 250}]Die Schleifenvariable buch ist keine Kopie: Sie ist das Dictionary aus der Liste selbst. Wenn du also buch["seiten"] änderst, bleibt die Änderung in buecher.
Nun zur Funktion. Wenn die Schleife einen Artikel mit demselben Namen findet, erhöht sie seine Menge und beendet die Funktion mit return, denn die Arbeit ist getan. Wenn die Schleife die ganze Liste durchläuft, ohne einen zu finden, geht die Funktion unter der Schleife weiter, und dort wird der neue Artikel angehängt. Die Zeile mit .append() gehört also hinter die Schleife. In der Schleife unter einem else würde sie einen neuen Artikel anhängen, sobald die Schleife an einen Artikel mit einem anderen Namen käme, und das ist das Brot ganz am Anfang.
Und denk daran, dass Text genau verglichen wird: "milch" ist nicht dasselbe wie "Milch".
So schreibst du es:
Anweisungen
- 1
Füge unten, unter den Eiern, noch zwei Packungen Milch hinzu:
artikel_hinzufuegen(warenkorb, "Milch", 2, 2). Auf dem Kassenbon erscheint eine zweite Milchzeile. - 2
Ändere
artikel_hinzufuegen(): Gehe nach der Prüfung der Menge in einer Schleife durchpositionen, und wenn ein Artikel denselben Namen wienamehat, erhöhe seine Menge ummengeund beende die Funktion mitreturn. Dann hat der Kassenbon nur eine Milchzeile,Milch: 6 x 2 € = 12 €, und die Summe beträgt54 €.