📝 Практические задания

⚡ Задания в двух словах

  • Задание 1.1 — фильтрация чётных через предикат.
  • Задание 1.2 — то же через filter и lambda.
  • Задание 2 — фильтрация строк по длине и критерию.
  • Задание 3 — произведение элементов через reduce.
  • Задание 4 — сортировка слов по длине.
  • Задание 5 — очередь задач с лимитом времени.
  • Задание 6 — средние оценки студентов.
  • Задание 7 — сортировка слов по сумме кодов символов.
  • Задание 8 — цепочка шифрования строки.

🏋️ Раздел тренировки

В этом разделе вы решите практические задачи на функции высшего порядка, lambda-выражения и аннотации типов.

Цель тренировки: научиться писать функции-предикаты, использовать filter/reduce/sorted и оформлять решения с type hints.

📂 Подготовка проекта

  1. Создайте папку для практики, например python-fundamentals-practice/lesson-45/.
  2. Создайте файл tasks.py и скопируйте в него условия заданий.
  3. Решайте каждое задание в отдельной функции с аннотациями типов.
  4. Запускайте файл через python tasks.py.

📌 Общее требование

Для каждой функции, выбранной для решения, добавьте аннотации типов принимаемых и возвращаемых значений.

Задание 1.1. Фильтрация чётных с функцией

Условие: напишите функцию-предикат, которая проверяет, является ли число чётным. Напишите также функцию, принимающую предикат и список чисел, и возвращающую новый список только с теми элементами, для которых предикат вернул True.

Данные: nums = [1, 2, 3, 4, 5, 6]

Ожидаемый результат: [2, 4, 6]

Подсказка: функция-предикат возвращает bool, а вторая функция обходит список и собирает подходящие элементы.

Задание 1.2. Фильтрация чётных с filter

Условие: выполните те же условия, что и в задании 1.1, но решите с помощью filter и lambda.

Данные: nums = [1, 2, 3, 4, 5, 6]

Ожидаемый результат: [2, 4, 6]

Подсказка: не забудьте преобразовать результат filter в список.

Задание 2.1. Фильтрация списка строк

Условие: отфильтруйте в новый список только слова, длина которых больше трёх символов. Реализуйте в виде функции.

Данные: words = ["hi", "Hello", "a", "python", "Ok"]

Ожидаемый результат: ['Hello', 'python']

Подсказка: используйте предикат lambda word: len(word) > 3.

Задание 2.2. Фильтрация списка строк по длине

Условие: доработайте функцию так, чтобы можно было передавать значение минимальной длины слов, которые нужно оставить.

Данные: words = ["hi", "Hello", "a", "python", "Ok"], min_len = 2

Ожидаемый результат: ['hi', 'Hello', 'python', 'Ok']

Подсказка: сделайте min_len параметром функции со значением по умолчанию.

Задание 2.3. Фильтрация списка строк по критерию

Условие: доработайте функцию так, чтобы можно было передавать критерий отбора слов. Например:

  • слова, начинающиеся с заглавной буквы;
  • слова из одного символа;
  • слова, которые начинаются и заканчиваются одной буквой, независимо от регистра.

Данные: words = ["hi", "Hello", "a", "python", "Ok", "Radar"]

Ожидаемый результат: ['Hello', 'Ok', 'Radar'], ['a'], ['a', 'Radar']

Подсказка: передайте функцию-предикат как аргумент.

Задание 3. Агрегирование списка

Условие: вычислите произведение всех элементов списка с помощью функции высшего порядка.

Данные: numbers = [1, 2, 3, 4, 5]

Ожидаемый результат: 120

Подсказка: используйте reduce из модуля functools.

Задание 4. Сортировка списка по длине

Условие: отсортируйте список слов по длине, используя параметр key.

Данные: words = ["apple", "banana", "kiwi", "grape"]

Ожидаемый результат: ['kiwi', 'grape', 'apple', 'banana']

Подсказка: в качестве ключа передайте функцию len.

Задание 5. Очередь с ограничением времени

Условие: реализуйте функцию, которая принимает очередь задач с указанием времени их выполнения и лимит. Если суммарное время превышает заданный лимит, программа должна удалять из очереди задачи с минимальным временем выполнения, пока лимит не будет соблюдён или не останется выполнимых за остаток времени задач.

Данные: tasks = {"task1": 5, "task2": 3, "task3": 7, "task4": 2}, time_limit = 10

Ожидаемый результат: {'task3': 7, 'task2': 3}

Подсказка: сортируйте задачи по убыванию времени и добавляйте самые длинные, пока хватает лимита.

Задание 6. Анализ оценок студентов

Условие: дан список студентов с их оценками по разным предметам. Напишите программу, которая:

  • вычисляет среднюю оценку для каждого студента;
  • возвращает словарь студентов с их средней оценкой, отсортированный по убыванию оценок.

Данные:

students = [
    {"name": "Alice", "grades": [90, 85, 88]},
    {"name": "Bob", "grades": [78, 81, 75]},
    {"name": "Charlie", "grades": [95, 92, 90]},
    {"name": "Diana", "grades": [88, 84, 82]}
]

Ожидаемый результат: {'Charlie': 92.33, 'Alice': 87.67, 'Diana': 84.67, 'Bob': 78.0}

Подсказка: используйте sum() и len() для среднего, затем sorted с key= для сортировки словаря.

Задание 7. Поиск максимального элемента (★ продвинутое)

Условие: отсортируйте слова в списке исходя из суммы порядковых номеров всех символов в слове. Например, "kiwi" = ord("k") + ord("i") + ord("w") + ord("i") = 436. Попробуйте решить в одну строку с помощью lambda и функций высшего порядка.

Данные: words = ["banana", "kiwi", "grapefruit", "apple"]

Ожидаемый результат: ['kiwi', 'apple', 'banana', 'grapefruit']

Подсказка: ключ сортировки — сумма ord(c) для всех символов слова.

Задание 8. Цепочка шифрования строки (★ продвинутое)

Условие: реализуйте функции:

  1. Преобразуйте все буквы в предложении в верхний регистр.
  2. Зашифруйте строку, сдвинув символы на 5 элементов вправо.
  3. Переверните строку.

Реализуйте функцию шифрования, которая последовательно применит каждую из списка переданных функций к переданной строке.

Данные: sentence = "Functional programming is powerful", functions = [to_uppercase, shift_encrypt, reverse_string]

Ожидаемый результат: QZKWJ\TU%XN%LSNRRFWLTWU%QFSTNYHSZK

Подсказка: используйте функцию высшего порядка, которая проходит по списку функций и применяет их к промежуточному результату.

Проверка понимания

Выберите один вариант ответа. После клика правильный ответ подсветится зелёным.

Вопрос 1

Что важнее всего в практическом задании?

Вопрос 2

Как безопаснее двигаться в практикуме?

Вопрос 3

Что делать, если решение не совпадает с ожидаемым результатом?

Вопрос 4

Какой стиль имён переменных обычно рекомендует PEP 8?

Вопрос 5

Зачем использовать f-strings в современном Python?

Вопрос 6

Когда полезен ранний возврат из функции?