"""
Реализуйте приложение для учёта финансов, умеющее запоминать, сколько денег было потрачено за день,
а также показывать затраты за отдельный месяц и за целый год.
В программе должно быть три endpoints:
/add// — сохранение информации о совершённой в рублях трате за какой-то день;
/calculate/ — получение суммарных трат за указанный год;
/calculate// — получение суммарных трат за указанные год и месяц.
Дата для /add/ передаётся в формате YYYYMMDD, где YYYY — год, MM — месяц (от 1 до 12), DD — число (от 01 до 31).
Гарантируется, что переданная дата имеет такой формат и она корректна (никаких 31 февраля).
"""
import datetime
from flask import Flask
app = Flask(__name__)
storage = {}
@app.route("/add//")
def add(date: str, number: int) -> str:
year = int(date[:4])
month = int(date[4:6])
day = int(date[6:8])
if check_date(year, month, day):
storage.setdefault(year, {}).setdefault(month, 0)
storage[year][month] += number
return f"Данные записаны: {storage}"
else:
return "Введенная дата некорректна. Повторите ввод даты!"
@app.route("/calculate/")
def calculate_year(year: int) -> str:
try:
expense = sum(storage[year].values())
return f"Траты за {year} год: {expense} рублей"
except KeyError:
return f'Нет данных за {year} год'
@app.route("/calculate//")
def calculate_month(year: int, month: int) -> str:
try:
return f"Траты за {year} год и {month} месяц: {storage[year][month]} рублей"
except KeyError:
return f'Нет данных за {year} год и {month} месяц.'
def check_date(year, month, day):
"""Date validator"""
try:
datetime.datetime(year, month, day)
correct_date = True
except ValueError:
correct_date = False
return correct_date
if __name__ == "__main__":
app.run(debug=True)
Есть необходимость доработать код для устранения таких замечаний:
В чем суть замечания - сейчас вы каждый раз пересчитываете все траты за год с помощью sum (он неявно проходится по всем значениям циклом): это O(N).
Можно немного поменять структуру storage так, чтобы суммарные затраты считались мгновенно: за O(1).
в storage[year] можно сразу хранить суммарные траты.
Оставьте, пожалуйста, как можно более подробный комментарий к изменениям.
Гарантия на работу | 1 год |
Средний балл | 4.96 |
Стоимость | Назначаете сами |
Эксперт | Выбираете сами |
Уникальность работы | от 70% |