Условие задачи
Создайте два калькулятора: для подсчёта денег и калорий. Пользовательскую часть калькуляторов, их «лицо», писать не нужно, напишите только логику — отдельный класс для каждого из калькуляторов.Калькулятор денег должен уметь:
- Сохранять новую запись о расходах методом
add_record()
- Считать, сколько денег потрачено сегодня методом
get_today_stats()
- Определять, сколько ещё денег можно потратить сегодня в рублях, долларах или евро — метод
get_today_cash_remained(currency)
- Считать, сколько денег потрачено за последние 7 дней — метод
get_week_stats()
Калькулятор калорий должен уметь:
- Сохранять новую запись о приёме пищи— метод
add_record()
- Считать, сколько калорий уже съедено сегодня — метод
get_today_stats()
- Определять, сколько ещё калорий можно/нужно получить сегодня — метод
get_calories_remained()
- Считать, сколько калорий получено за последние 7 дней — метод
get_week_stats()
У калькуляторов много пересекающихся функций: они должны уметь хранить какие-то записи (о еде или деньгах, но по сути — всё числа и даты), знать дневной лимит (сколько в день можно истратить денег или сколько калорий можно получить) и суммировать записи за конкретные даты. Всю эту общую функциональность заложите в родительский класс Calculator, а от него унаследуйте классы CaloriesCalculator и CashCalculator. Конструктор класса Calculator должен принимать один аргумент — число limit
(дневной лимит трат/калорий, который задал пользователь). В конструкторе создайте пустой список, в котором потом будут храниться записи (назовите его records
). Чтобы было удобнее создавать записи, создайте для них отдельный класс Record. В нём сохраните:
- число
amount
(денежная сумма или количество килокалорий), - дату создания записи
date
(передаётся в явном виде в конструктор, либо присваивается значение по умолчанию — текущая дата), - комментарий
comment
, поясняющий, на что потрачены деньги или откуда взялись калории.
Примеры таких записей:
# для CashCalculator
r1 = Record(amount=145, comment='Безудержный шопинг', date='08.03.2019')
r2 = Record(amount=1568,
comment='Наполнение потребительской корзины',
date='09.03.2019')
r3 = Record(amount=691, comment='Катание на такси', date='08.03.2019')
# для CaloriesCalculator
r4 = Record(amount=1186,
comment='Кусок тортика. И ещё один.',
date='24.02.2019')
r5 = Record(amount=84, comment='Йогурт.', date='23.02.2019')
r6 = Record(amount=1140, comment='Баночка чипсов.', date='24.02.2019')
Код должен соответствовать требованиям оформления кода Яндекс.Практикум.Использование Type Hints в этом проекте не обязательно.
Подробнее о формате вывода
1. Метод get_calories_remained()
калькулятора калорий должен возвращать ответ
- «Сегодня можно съесть что-нибудь ещё, но с общей калорийностью не более N кКал», если лимит
limit
не достигнут, - или «Хватит есть!», если лимит достигнут или превышен.
2. Метод get_today_cash_remained(currency)
денежного калькулятора должен принимать на вход код валюты: одну из строк "rub"
, "usd"
или "eur"
.Возвращает он сообщение о состоянии дневного баланса в этой валюте, округляя сумму до двух знаков после запятой (до сотых):
- «На сегодня осталось N руб/USD/Euro» — в случае, если лимит
limit
не достигнут, - или «Денег нет, держись», если лимит достигнут,
- или «Денег нет, держись: твой долг — N руб/USD/Euro», если лимит превышен.
Курс валют укажите константами USD_RATE
и EURO_RATE
, прямо в теле класса CashCalculator. Какой курс вы укажете — не так важно, выберите любой, похожий на правду. Значения обменного курса можно посмотреть, например, на главной странице Яндекса https://yandex.ru.
Рекомендации и подсказки
- Как добавлять новую запись
Метод add_record()
в качестве аргумента принимает объект класса Record и сохраняет его в списке records
.
- Как работать со временем и датой
Вам понадобится функция для преобразования дат из строк в формат datetime.date
и функция dt.datetime.now()
, которая возвращает текущую дату. Есть повод повторить урок про datetime
из бесплатного курса по Python
import datetime as dt
date_format = '%d.%m.%Y'
moment = dt.datetime.strptime('16.12.2019', date_format)
print(moment)
# напечатает что-то вроде 2019-12-16 00:00:00
day = moment.date()
print(day)
# напечатает дату: 2019-12-16
now = dt.datetime.now()
print(now)
# напечатает время на текущий момент в формате: 2019-01-31 13:33:27.506227
print(now.date())
# напечатает текущую дату: 2019-01-31
- Как проверить, что всё работает
Чтобы своими глазами увидеть, что ваши классы работают правильно, напишите какой-нибудь сценарий их использования. Например:
import datetime as dt
class Record:
...
class Calculator:
...
class CaloriesCalculator:
...
class CashCalculator:
...
# создадим калькулятор денег с дневным лимитом 1000
cash_calculator = CashCalculator(1000)
# дата в параметрах не указана,
# так что по умолчанию к записи
# должна автоматически добавиться сегодняшняя дата
cash_calculator.add_record(Record(amount=145, comment='кофе'))
# и к этой записи тоже дата должна добавиться автоматически
cash_calculator.add_record(Record(amount=300, comment='Серёге за обед'))
# а тут пользователь указал дату, сохраняем её
cash_calculator.add_record(Record(amount=3000,
comment='бар в Танин др',
date='08.11.2019'))
print(cash_calculator.get_today_cash_remained('rub'))
# должно напечататься
# На сегодня осталось 555 руб