@A-Z-X

Задание из практикума, не могу сделать уже целую неделю. Какие есть ошибки?

Опишите функции 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

goods = {}
DATE_FORMAT = '%Y-%m-%d'

def add(items, title, amount, expiration_date=None):
    """
    Добавляет продукт в хранилище.
    """
    if title not in items:
        items[title] = []
    items[title].append({'amount': amount, 'expiration_date': expiration_date})
    print(items)  # Выводим словарь, чтобы увидеть, как он изменяется

def add_by_note(items, note):
    """
    Добавляет продукт в хранилище из текстового описания.
    """
    parts = note.split(' ')
    if len(parts) == 3:
        title, amount, expiration_date = parts
        if expiration_date.lower() == 'none':
            expiration_date = None
        else:
            expiration_date = datetime.datetime.strptime(expiration_date, DATE_FORMAT).date()
        add(items, title, Decimal(amount), expiration_date)
    elif len(parts) == 2:
        amount = Decimal(parts[-1])
        title = ' '.join(parts[:-1])
        add(items, title, amount, None)
    else:
        print("Некорректный формат строки.")

def find(items, needle):
    """
    Ищет продукты по части названия, не учитывая регистр.
    """
    result = []
    for title in items:
        if needle.lower() in title.lower():
            result.append(title)
    return result

def amount(items, needle):
    """
    Считает общее количество найденных продуктов.
    """
    total_amount = Decimal('0')
    for product in find(items, needle):
        total_amount += sum(batch['amount'] for batch in items[product])
    return total_amount

def expire(items, in_advance_days=0):
    """
    Находит продукты, у которых срок годности истекает в указанное количество дней.
    """
    today = datetime.date.today() + datetime.timedelta(days=in_advance_days)
    expiring_items = []
    for title, batches in items.items():
        for batch in batches:
            if batch['expiration_date'] and batch['expiration_date'] < today:
                expiring_items.append({'title': title, 'expiration_date': batch['expiration_date']})
                break
    return expiring_items

# Пример использования:
add_by_note(goods, 'Яйца Фабрики №1 10 2023-07-15')
add_by_note(goods, 'Молоко 1.5 2023-10-28')
add_by_note(goods, 'Хлеб 1 none')
add_by_note(goods, 'Макароны 1.5') 

print("Товары в холодильнике:")
for title, batches in goods.items():
    for batch in batches:
        print(f" - {title}: {batch['amount']} ({batch['expiration_date'] if batch['expiration_date'] else 'Без срока годности'})")

print("\nНайденные товары:")
print(find(goods, 'Яйца'))

print("\nОбщее количество Яиц:")
print(amount(goods, 'Яйца'))

print("\nПродукты с истекающим сроком годности:")
print(expire(goods, 12))
print(expire(goods))
  • Вопрос задан
  • 793 просмотра
Пригласить эксперта
Ответы на вопрос 1
Vindicar
@Vindicar
RTFM!
У тебя как минимум один косяк в expire().
for title, batches in items.items():
    for batch in batches:
        if batch['expiration_date'] and batch['expiration_date'] < today:
            expiring_items.append({'title': title, 'expiration_date': batch['expiration_date']})
            break  # <--- ???

Ты находишь первую "протухшую" партию для товара, и сразу же переходишь к следующему товару. А если у одного товара несколько "протухших" партий?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы