«Кофейная лавка» печатает новые ценники к осенней распродаже. На каждом — название, объём и цена, а у
напитков со скидкой — цена после скидки. Заодно владелец хочет знать, какой напиток выгоднее всего по цене
за 100 мл. Почти всё в проекте — из модуля: класс, __init__, методы и экземпляры в списке. Новое только одно —
в шаге 2 метод вызовет другой метод того же экземпляра.
Шаг 1. Класс товара
Допишите класс Product. Product("Капучино", 220, 300) хранит название, цену в рублях и объём в миллилитрах
в атрибутах name, price и volume. Методы:
per_100ml()возвращает цену за 100 мл, округлённую до одного знака после запятой: у капучино — 73.3;discounted(percent)возвращает цену со скидкойpercentпроцентов, округлённую до целых рублей, и не меняетprice:discounted(20)у капучино — 176.
round(self.price / self.volume * 100, 1).round(self.price * (100 - percent) / 100); в self.price ничего не записывайте.Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
class Product:
def __init__(self, name, price, volume):
...
def per_100ml(self):
...
def discounted(self, percent):
...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
class Product:
def __init__(self, name, price, volume):
self.name = name
self.price = price
self.volume = volume
def per_100ml(self):
return round(self.price / self.volume * 100, 1)
def discounted(self, percent):
return round(self.price * (100 - percent) / 100)Шаг 2. Ценник
Метод может вызывать другие методы того же экземпляра — через self: self.discounted(percent).
Добавьте в класс метод card(percent=0) — текст ценника. Без скидки: "Капучино, 300 мл — 220 ₽", со
скидкой — цена после скидки и пометка: "Капучино, 300 мл — 176 ₽ (скидка 20 %)".
Класс объявляется одним блоком, поэтому скопируйте в ячейку класс из шага 1 целиком и допишите новый метод.
percent == 0 — верните строку с self.price, иначе — с self.discounted(percent) и пометкой.Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
class Product:
# скопируйте сюда __init__, per_100ml и discounted из шага 1
def card(self, percent=0):
...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
class Product:
def __init__(self, name, price, volume):
self.name = name
self.price = price
self.volume = volume
def per_100ml(self):
return round(self.price / self.volume * 100, 1)
def discounted(self, percent):
return round(self.price * (100 - percent) / 100)
def card(self, percent=0):
if percent == 0:
return f"{self.name}, {self.volume} мл — {self.price} ₽"
return f"{self.name}, {self.volume} мл — {self.discounted(percent)} ₽ (скидка {percent} %)"Шаг 3. Каталог
В data — тройки «название, цена, объём». Создайте список catalog из экземпляров Product (из шага 2)
по этим данным, в том же порядке.
[Product(name, price, volume) for name, price, volume in data].Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
data = [
("Эспрессо", 150, 60),
("Капучино", 220, 300),
("Латте", 240, 400),
("Раф", 260, 300),
("Американо", 170, 250),
("Какао", 190, 300),
]
catalog = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
data = [
("Эспрессо", 150, 60),
("Капучино", 220, 300),
("Латте", 240, 400),
("Раф", 260, 300),
("Американо", 170, 250),
("Какао", 190, 300),
]
catalog = [Product(name, price, volume) for name, price, volume in data]for p in catalog:
print(p.card())Эспрессо, 60 мл — 150 ₽ Капучино, 300 мл — 220 ₽ Латте, 400 мл — 240 ₽ Раф, 300 мл — 260 ₽ Американо, 250 мл — 170 ₽ Какао, 300 мл — 190 ₽
Шаг 4. Ценники к распродаже
На распродаже все напитки — со скидкой 20 %. Сохраните в cards список текстов ценников для всего каталога
по порядку, а в sale_total — сколько стоит взять по одному напитку каждого вида по ценам распродажи.
catalog уже есть: [p.card(20) for p in catalog].sum(p.discounted(20) for p in catalog): sum можно передать выражение «как генератор списка», но без квадратных скобок — это то же, что sum([...]).Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
cards = ...
sale_total = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
cards = [p.card(20) for p in catalog]
sale_total = sum(p.discounted(20) for p in catalog)Шаг 5. Самый выгодный
Найдите в каталоге напиток с самой низкой ценой за 100 мл и сохраните сам экземпляр в best.
per_100ml() меньше, чем у лучшего, он становится лучшим.Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
best = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
best = catalog[0]
for p in catalog:
if p.per_100ml() < best.per_100ml():
best = pИтог
print("Осенняя распродажа — скидка 20 %")
for text in cards:
print(" ", text)
print(f"Всё меню по одной чашке: {sale_total} ₽")
print(f"Выгоднее всего: {best.name} — {best.per_100ml()} ₽ за 100 мл")Осенняя распродажа — скидка 20 % Эспрессо, 60 мл — 120 ₽ (скидка 20 %) Капучино, 300 мл — 176 ₽ (скидка 20 %) Латте, 400 мл — 192 ₽ (скидка 20 %) Раф, 300 мл — 208 ₽ (скидка 20 %) Американо, 250 мл — 136 ₽ (скидка 20 %) Какао, 300 мл — 152 ₽ (скидка 20 %) Всё меню по одной чашке: 984 ₽ Выгоднее всего: Латте — 60.0 ₽ за 100 мл
Самый выгодный напиток — латте: 60 ₽ за 100 мл, вчетверо дешевле эспрессо, хотя эспрессо в меню самый дешёвый.
Цена за чашку и цена за объём — разные вопросы, и класс Product отвечает на оба одним вызовом метода.
Посмотрите, что дал класс: данные товара и всё, что с ним считают, лежат в одном месте. Чтобы поменять формат
ценника, достаточно поправить один метод card — и он изменится у всех товаров сразу. В следующем модуле
экземпляры начнут хранить другие экземпляры: появится корзина с товарами.