🏠 Домашнее задание

⚡ Суть задания

Домашнее задание состоит из трёх задач: бесконечный планировщик дней недели с помощью itertools.cycle, объединение списков продуктов в генератор и генерация всех комбинаций одежды через itertools.product.

Результат: три рабочих скрипта, демонстрирующих умение работать с итераторами и генераторами.

📋 Формулировка задания

Исходное задание из LMS:

1. План по дням недели. Напишите программу, которая помогает планировать дела. Программа должна бесконечно выводить план на следующий день недели, пока пользователь нажимает Enter.

# Расписание дел на неделю
WEEKLY_SCHEDULE = {
    "Monday": ["Gym", "Work", "Read book"],
    "Tuesday": ["Meeting", "Work", "Study Python"],
    "Wednesday": ["Shopping", "Work", "Watch movie"],
    "Thursday": ["Work", "Call parents", "Play guitar"],
    "Friday": ["Work", "Dinner with friends"],
    "Saturday": ["Hiking", "Rest"],
    "Sunday": ["Family time", "Rest"]
}

Пример ввода/вывода:

Нажмите 'Enter' для получения плана: 
Monday: Gym, Work, Read book
Нажмите 'Enter' для получения плана: 
Tuesday: Meeting, Work, Study Python
...
Нажмите 'Enter' для получения плана: q

2. Объединение списков продуктов. Напишите функцию, которая принимает несколько списков с названиями продуктов и возвращает генератор, содержащий все продукты в нижнем регистре. Выведите содержимое генератора.

fruits = ["Apple", "Banana", "Orange"]
vegetables = ["Carrot", "Tomato", "Cucumber"]
dairy = ["Milk", "Cheese", "Yogurt"]

Пример вывода: apple banana orange carrot tomato cucumber milk cheese yogurt.

3. Комбинации одежды. Напишите функцию, которая принимает списки типов одежды, цветов и размеров, а затем генерирует все возможные комбинации в формате "Clothe - Color - Size".

clothes = ["T-shirt", "Jeans", "Jacket"]
colors = ["Red", "Blue", "Black"]
sizes = ["S", "M", "L"]

🔧 Шаг 0. Подготовка окружения

Для этого урока не требуется устанавливать сторонние пакеты — достаточно стандартной библиотеки Python.

1

Создайте рабочую папку

mkdir -p python-fundamentals-practice/lesson-54
cd python-fundamentals-practice/lesson-54
2

Создайте виртуальное окружение (опционально, но рекомендуется)

# Windows
python -m venv venv
venv\Scripts\activate

# Mac / Linux
python3 -m venv venv
source venv/bin/activate
3

Создайте файлы для каждой задачи

type nul > task_1_planner.py
type nul > task_2_products.py
type nul > task_3_outfits.py
Проверить по документации: аннотации типов в решениях ниже выходят за рамки исходного задания. Они помогают читать код, но не обязательны для сдачи в LMS.

✅ Полное решение

Ниже приведены эталонные решения. Попробуйте написать код самостоятельно перед просмотром.

Задача 1. Планировщик дней недели

from itertools import cycle

WEEKLY_SCHEDULE = {
    "Monday": ["Gym", "Work", "Read book"],
    "Tuesday": ["Meeting", "Work", "Study Python"],
    "Wednesday": ["Shopping", "Work", "Watch movie"],
    "Thursday": ["Work", "Call parents", "Play guitar"],
    "Friday": ["Work", "Dinner with friends"],
    "Saturday": ["Hiking", "Rest"],
    "Sunday": ["Family time", "Rest"]
}


def run_planner() -> None:
    """Бесконечно выводит план на следующий день недели."""
    days = cycle(WEEKLY_SCHEDULE.items())

    while True:
        user_input = input("Нажмите 'Enter' для получения плана: ")
        if user_input.lower() == "q":
            break

        day, tasks = next(days)
        print(f"{day}: {', '.join(tasks)}")


if __name__ == "__main__":
    run_planner()

Задача 2. Объединение списков продуктов

import itertools
from collections.abc import Iterator


def merge_lower(*lists: list[str]) -> Iterator[str]:
    """Объединяет любое количество списков, возвращая названия в нижнем регистре."""
    return (item.lower() for item in itertools.chain.from_iterable(lists))


def main() -> None:
    fruits = ["Apple", "Banana", "Orange"]
    vegetables = ["Carrot", "Tomato", "Cucumber"]
    dairy = ["Milk", "Cheese", "Yogurt"]

    for product in merge_lower(fruits, vegetables, dairy):
        print(product)


if __name__ == "__main__":
    main()

Задача 3. Комбинации одежды

import itertools
from collections.abc import Iterator


def generate_outfits(clothes: list[str], colors: list[str], sizes: list[str]) -> Iterator[str]:
    """Генерирует все комбинации одежды в формате 'Clothe - Color - Size'."""
    return (
        f"{cloth} - {color} - {size}"
        for cloth, color, size in itertools.product(clothes, colors, sizes)
    )


def main() -> None:
    clothes = ["T-shirt", "Jeans", "Jacket"]
    colors = ["Red", "Blue", "Black"]
    sizes = ["S", "M", "L"]

    for outfit in generate_outfits(clothes, colors, sizes):
        print(outfit)


if __name__ == "__main__":
    main()

🧪 Как проверить решение

  1. Активируйте venv (если создавали).
  2. Запустите каждый файл: python task_1_planner.py, python task_2_products.py, python task_3_outfits.py.
  3. Для первой задачи нажмите Enter несколько раз, убедитесь, что дни повторяются по кругу, и введите q для выхода.
  4. Убедитесь, что в терминале нет ошибок и вывод соответствует условию.

🐛 Отладка

Если что-то не работает:

  1. Проверьте, что генератор не исчерпан до вывода.
  2. Используйте print(list(generator)) только для отладки — в финальном коде это может съесть память.
  3. Читайте traceback: Python укажет строку с ошибкой.

💾 Сохранение работы

git add python-fundamentals-practice/lesson-54/
git commit -m "lesson-54: iterators and generator expressions"
git push