Опишите функции add(), add_by_note(), find(), amount() и expire().
Не пытайтесь сделать всю работу одновременно: выполняйте её по шагам. Объявите словарь goods, добавьте в него пару продуктов — их можно скопировать из приведённых примеров. Займитесь функцией add() — научите её добавлять продукты в словарь. Протестируйте работу этой функции и переходите к следующей. На каждом этапе перечитывайте подсказки и описания, относящиеся к функции, над которой вы работаете. Каждую готовую функцию вызовите несколько раз с разными аргументами: с необязательными аргументами и без них, со вчерашней и завтрашней датой (через сто лет — тоже попробуйте), передайте в add() и add_by_note() новые продукты и те, что уже есть в словаре goods. Тестирование программы — значительная и обязательная часть работы, не пренебрегайте ей. Подсказки Формат даты можно определить константой DATE_FORMAT = '%Y-%m-%d'. Функция add(). Проверить, есть ли название продукта (title) в словаре items. Преобразовать строку с датой в тип date с помощью модуля datetime. Применить list.append() для добавления словаря с ключами 'amount' и 'expiration_date' в список партий продукта с конкретным title. Функция add_by_note(). Разделить строку на части по пробелам с помощью str.split. Определить, является ли последняя часть строки датой. Ту часть строки, где указано количество продукта, конвертировать в число типа Decimal Оставшуюся часть строки объединить, чтобы получить название продукта: если название состояло из нескольких слов — функция str.split разобъёт его на части. Вызвать функцию add(), передав в неё получившиеся данные — название, количество и срок хранения. Функция find(). Перебрать ключи словаря. При переборе применить к ключам функцию lower, чтобы провести поиск без учёта регистра. Найденные названия продуктов добавить в список с результатами поиска при помощи функции append. Функция amount(). Применить функцию find() для получения списка подходящих товаров. Суммировать значения amount найденных продуктов для вычисления количества каждого найденного товара. Функция expire(). Получить текущую дату с помощью datetime.date.today (). Добавить количество дней из запроса к текущей дате. Перебрать все партии продукта и для каждой проверить, истекает ли срок годности: сравнить его с текущей датой и с датой истечения срока годности.
Код import datetime from decimal import Decimal
DATE_FORMAT = '%Y-%m-%d'
goods = {}
def add(items, title, amount, expiration_date=None): if title not in items: items[title] = [] expiration_date = dt.datetime.strptime( expiration_date, DATE_FORMAT ).date() if expiration_date else expiration_date list.append( items[title], {'amount': amount, 'expiration_date': expiration_date} )
def add_by_note(items, note): parts = str.split(note, ' ') print(parts) if len(str.split(parts[-1], '-')) == 3: expiration_date = parts[-1] good_amount = Decimal(parts[-2]) title = str.join(' ', parts[0:-2]) print(expiration_date, good_amount, title)
Не пытайтесь сделать всю работу одновременно: выполняйте её по шагам.
Объявите словарь goods, добавьте в него пару продуктов — их можно скопировать из приведённых примеров.
Займитесь функцией add() — научите её добавлять продукты в словарь. Протестируйте работу этой функции и переходите к следующей. На каждом этапе перечитывайте подсказки и описания, относящиеся к функции, над которой вы работаете.
Каждую готовую функцию вызовите несколько раз с разными аргументами:
с необязательными аргументами и без них,
со вчерашней и завтрашней датой (через сто лет — тоже попробуйте),
передайте в add() и add_by_note() новые продукты и те, что уже есть в словаре goods.
Тестирование программы — значительная и обязательная часть работы, не пренебрегайте ей.
Подсказки
Формат даты можно определить константой DATE_FORMAT = '%Y-%m-%d'.
Функция add().
Проверить, есть ли название продукта (title) в словаре items.
Преобразовать строку с датой в тип date с помощью модуля datetime.
Применить list.append() для добавления словаря с ключами 'amount' и 'expiration_date' в список партий продукта с конкретным title.
Функция add_by_note().
Разделить строку на части по пробелам с помощью str.split.
Определить, является ли последняя часть строки датой.
Ту часть строки, где указано количество продукта, конвертировать в число типа Decimal
Оставшуюся часть строки объединить, чтобы получить название продукта: если название состояло из нескольких слов — функция str.split разобъёт его на части.
Вызвать функцию add(), передав в неё получившиеся данные — название, количество и срок хранения.
Функция find().
Перебрать ключи словаря.
При переборе применить к ключам функцию lower, чтобы провести поиск без учёта регистра.
Найденные названия продуктов добавить в список с результатами поиска при помощи функции append.
Функция amount().
Применить функцию find() для получения списка подходящих товаров.
Суммировать значения amount найденных продуктов для вычисления количества каждого найденного товара.
Функция expire().
Получить текущую дату с помощью datetime.date.today ().
Добавить количество дней из запроса к текущей дате.
Перебрать все партии продукта и для каждой проверить, истекает ли срок годности: сравнить его с текущей датой и с датой истечения срока годности.
Код
import datetime
from decimal import Decimal
DATE_FORMAT = '%Y-%m-%d'
goods = {}
def add(items, title, amount, expiration_date=None):
if title not in items:
items[title] = []
expiration_date = dt.datetime.strptime(
expiration_date,
DATE_FORMAT
).date() if expiration_date else expiration_date
list.append(
items[title],
{'amount': amount, 'expiration_date': expiration_date}
)
def add_by_note(items, note):
parts = str.split(note, ' ')
print(parts)
if len(str.split(parts[-1], '-')) == 3:
expiration_date = parts[-1]
good_amount = Decimal(parts[-2])
title = str.join(' ', parts[0:-2])
print(expiration_date, good_amount, title)
def find(items, needle):
...
def amount(items, needle):
...
def expire(items, in_advance_days=0):
...