Пример 1. Предикат и фильтрация
Отдельная функция-предикат делает код понятнее, когда условие сложное или используется в нескольких местах.
# predicate_filter.py
from typing import Callable
def is_even(n: int) -> bool:
return n % 2 == 0
def filter_numbers(
predicate: Callable[[int], bool],
numbers: list[int]
) -> list[int]:
return [n for n in numbers if predicate(n)]
nums = [1, 2, 3, 4, 5, 6]
print(filter_numbers(is_even, nums)) # [2, 4, 6]
Что происходит: функция filter_numbers принимает другую функцию и список, обходит список и оставляет только элементы, прошедшие проверку.
Пример 2. Фильтрация с lambda
Для простых условий можно обойтись без отдельной функции.
# lambda_filter.py
nums = [1, 2, 3, 4, 5, 6]
evens = list(filter(lambda x: x % 2 == 0, nums))
print(evens) # [2, 4, 6]
filter возвращает итератор, поэтому результат нужно преобразовать в список для вывода.
Пример 3. Агрегирование через reduce
Произведение элементов удобно вычислять через reduce из модуля functools.
# reduce_product.py
from functools import reduce
def product(numbers: list[int]) -> int:
return reduce(lambda acc, x: acc * x, numbers, 1)
numbers = [1, 2, 3, 4, 5]
print(product(numbers)) # 120
Начальное значение 1 важно: оно даёт корректный результат для пустого списка и не меняет произведение для непустого.
Пример 4. Сортировка по длине
# sort_by_length.py
def sort_by_length(words: list[str]) -> list[str]:
return sorted(words, key=len)
words = ["apple", "banana", "kiwi", "grape"]
print(sort_by_length(words)) # ['kiwi', 'grape', 'apple', 'banana']
Функция len применяется к каждому слову, и сортировка идёт по полученным числам.
Пример 5. Сортировка по сумме кодов символов
Сложный ключ сортировки можно записать лямбдой.
# sort_by_ord_sum.py
words = ["banana", "kiwi", "grapefruit", "apple"]
sorted_words = sorted(words, key=lambda word: sum(ord(c) for c in word))
print(sorted_words) # ['kiwi', 'apple', 'banana', 'grapefruit']
Генератор sum(ord(c) for c in word) вычисляет сумму кодов символов слова, и sorted использует эту сумму как ключ.
Пример 6. Композиция функций для шифрования
Цепочка преобразований строки: верхний регистр, сдвиг символов, переворот.
# encryption_chain.py
from typing import Callable
def to_uppercase(text: str) -> str:
return text.upper()
def shift_encrypt(text: str, shift: int = 5) -> str:
return "".join(chr(ord(c) + shift) for c in text)
def reverse_string(text: str) -> str:
return text[::-1]
def encrypt(
text: str,
functions: list[Callable[[str], str]]
) -> str:
result = text
for func in functions:
result = func(result)
return result
sentence = "Functional programming is powerful"
functions = [to_uppercase, shift_encrypt, reverse_string]
print(encrypt(sentence, functions))
Что происходит: каждая функция по очереди преобразует строку. Функция encrypt не зависит от конкретного списка шагов — её можно переиспользовать.
Как запустить в VS Code
- Создайте файл, например
practice11.py. - Скопируйте код одного из примеров.
- Откройте терминал в VS Code (Ctrl + `).
- Убедитесь, что активировано виртуальное окружение:
venv\Scripts\activate(Windows) илиsource venv/bin/activate(Mac/Linux). - Запустите:
python practice11.py