Один товар дважды
Покупатель хочет ещё две упаковки молока: add_item(cart, "Молоко", 2, 2). Ваша программа добавляет в чек вторую строку с молоком. Это не ошибка, но настоящий магазин просто изменил бы количество в уже существующей строке: Молоко: 6 x $2 = $12.
Значит, прежде чем добавить новый товар, add_item() должна поискать в списке товар с таким же названием. Вот как найти словарь в списке и изменить его:
books = [
{"title": "Хоббит", "pages": 310},
{"title": "Матильда", "pages": 240},
]
for book in books:
if book["title"] == "Матильда":
book["pages"] += 10
print(books)[{'title': 'Хоббит', 'pages': 310}, {'title': 'Матильда', 'pages': 250}]Переменная цикла book — не копия: это сам словарь из списка. Поэтому когда вы меняете book["pages"], изменение остаётся в books.
Теперь функция. Если цикл находит товар с таким же названием, он увеличивает его количество и завершает функцию с помощью return, потому что дело сделано. Если цикл прошёл весь список и ничего не нашёл, функция продолжается под циклом, и именно там добавляется новый товар. Поэтому строка с .append() стоит после цикла. Внутри цикла под else она добавляла бы новый товар, как только цикл дошёл бы до товара с другим названием, то есть сразу же, на хлебе в самом начале.
И помните, что текст сравнивается точно: "молоко" — это не то же самое, что "Молоко".
Задание
- 1
Внизу, под яйцами, добавьте ещё две упаковки молока:
add_item(cart, "Молоко", 2, 2). В чеке появится вторая строка с молоком. - 2
Измените
add_item(): после проверки количества переберитеitemsв цикле, и если у какого-то товара то же название, что иname, увеличьте его количество наquantityи завершите функцию с помощьюreturn. Тогда в чеке будет одна строка с молоком,Молоко: 6 x $2 = $12, а итог составит$54.