Калькулятор денег и калорий
Вы добрались до итогового проекта спринта. Когда вы выполните это задание — в вашем распоряжении окажутся два отличных инструмента для контроля расходов и доходов.
Перед тем, как приступить к заданию — технические подробности.
Менеджер пакетов pip
Вы уже устанавливали программы через пакетный менеджер Chocolatey или brew. Существуют и специализированные менеджеры пакетов.
Вместе с Python на ваш компьютер был установлен пакетный менеджер
pip, он поможет вам управлять модулями, библиотеками и фреймворками в среде Python. Б
ольшая часть питоньих пакетов выложена в публичный доступ на сайте
https://pypi.org/ (
Python Package Index), именно туда будет по умолчанию обращаться
pip по команде
Скопировать кодBASH
$ pip install chto-nibud'
Если требуется установить строго определённую версию пакета — просто укажите её:
Скопировать кодBASH
$ pip install django==2.02
Если по какой-то причине команды для pip не срабатывают, попробуйте обращаться не к pip, а к pip3:
Скопировать кодBASH
$ pip3 install chto-nibud'
Для Python написаны и другие менеджеры пакетов, но пока еще ни один не стал более популярен, чем pip.
Порядок работы над заданием
- Сейчас необходимо привязать свой аккаунт GitHub к аккаунту Яндекс-Практикума.
- После связывания аккаунтов на вашем GitHub автоматически появится новый приватный репозиторий
hw_python_oop. - Склонируйте этот репозиторий на свой компьютер. Сейчас в репозитории
hw_python_oop лежит пустая заготовка кода и набор автоматических тестов. - Установите программу автоматического тестирования кода
pytest. Перед тем, как сдавать решение на проверку, убедитесь, что автоматические тесты проходят успешно. Как как установить pytest и запустить тесты — прочитайте здесь. - Когда все тесты пройдены — запушьте ваш код (выполните
git push) в ваш репозиторий hw_python_oop. После этого нажмите кнопку «Отправить на проверку».
Будьте внимательны: файлы и папки вашего проекта должны быть размещены в головной папке репозитория, который вы скачали.
Если проект не удается отправить обычным способом и платформа предлагает загрузить проект архивом, соблюдайте два правила:
- Ваш архив с проектом должен быть именно в формате ZIP. Формат архива принципиально важен.
- Размер архива не должен быть больше 4 MB
- Автоматические тесты будут ещё раз запущены на платформе, и если ваше решение их проходит, оно отправится на code review, его проверят специалисты.
В случае затруднений вернитесь к уроку «Знакомство с Git».
Условие задачи
Создайте два калькулятора: для подсчёта денег и калорий. Пользовательскую часть калькуляторов, их «лицо», писать не нужно, напишите только логику — отдельный класс для каждого из калькуляторов.
Калькулятор денег должен уметь:
- Сохранять новую запись о расходах методом
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, поясняющий, на что потрачены деньги или откуда взялись калории.
Примеры таких записей:
Скопировать кодPYTHON
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")
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")
Подробнее о формате вывода
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 :)
Скопировать кодPYTHON
import datetime as dt
date_format = '%d.%m.%Y'
moment = dt.datetime.strptime('16.12.2019', date_format)
print(moment)
day = moment.date()
print(day)
now = dt.datetime.now()
print(now)
print(now.date())
- Как проверить, что всё работает
Чтобы своими глазами увидеть, что ваши классы работают правильно, напишите какой-нибудь сценарий их использования.
Например:
Скопировать кодPYTHON
import datetime as dt
class Record:
...
class Calculator:
...
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"))