🏋️ Раздел тренировки
В этом разделе вы решите практические задачи на функции высшего порядка, lambda-выражения и аннотации типов.
📂 Подготовка проекта
- Создайте папку для практики, например
python-fundamentals-practice/lesson-45/. - Создайте файл
tasks.pyи скопируйте в него условия заданий. - Решайте каждое задание в отдельной функции с аннотациями типов.
- Запускайте файл через
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. Цепочка шифрования строки (★ продвинутое)
Условие: реализуйте функции:
- Преобразуйте все буквы в предложении в верхний регистр.
- Зашифруйте строку, сдвинув символы на 5 элементов вправо.
- Переверните строку.
Реализуйте функцию шифрования, которая последовательно применит каждую из списка переданных функций к переданной строке.
Данные: sentence = "Functional programming is powerful", functions = [to_uppercase, shift_encrypt, reverse_string]
Ожидаемый результат: QZKWJ\TU%XN%LSNRRFWLTWU%QFSTNYHSZK
Подсказка: используйте функцию высшего порядка, которая проходит по списку функций и применяет их к промежуточному результату.