⚖️ Старый и современный подход

⚡ Различия в двух словах

Старый: в Python 2 filter и map сразу возвращали списки; для аннотаций коллекций использовался typing.List.

Новый: в Python 3 filter/map возвращают ленивые итераторы; в Python 3.9+ используются list[int] и dict[str, int].

Вывод: современный Python делает фильтрацию и сортировку более гибкой и экономной, но требует явного преобразования итераторов в списки.

📜 Фильтрация: старый подход

# old_filter.py
nums = [1, 2, 3, 4, 5, 6]
evens = []
for n in nums:
    if n % 2 == 0:
        evens.append(n)
print(evens)

Что здесь происходит: явный цикл for с проверкой и накоплением результата. Работает в любой версии Python, но занимает больше строк.

✅ Современный вариант

# modern_filter.py
nums = [1, 2, 3, 4, 5, 6]
evens = [n for n in nums if n % 2 == 0]
print(evens)

# или через filter + lambda
evens_lambda = list(filter(lambda n: n % 2 == 0, nums))

Что улучшилось: list comprehension короче и быстрее; filter + lambda явно говорит о намерении отфильтровать.

Преимущества:
  • Меньше визуального шума.
  • Читаемость привычной операции фильтрации.
  • list comprehension обычно работает быстрее, чем цикл с append.

📜 Аннотации: стиль Python <3.9

# old_typing.py
from typing import Callable, List


def filter_evens(
    predicate: Callable[[int], bool],
    numbers: List[int]
) -> List[int]:
    return [n for n in numbers if predicate(n)]

Что здесь происходит: generic-типы импортируются из модуля typing с заглавной буквы.

✅ Современный вариант (Python 3.9+)

# modern_typing.py
from typing import Callable


def filter_evens(
    predicate: Callable[[int], bool],
    numbers: list[int]
) -> list[int]:
    return [n for n in numbers if predicate(n)]

Что улучшилось: встроенные типы list[int] читаются естественнее и не требуют лишних импортов.

📜 Сортировка: функция-ключ вручную

# old_sort.py
words = ["apple", "banana", "kiwi", "grape"]

pairs = []
for word in words:
    pairs.append((len(word), word))
pairs.sort()
sorted_words = [word for _, word in pairs]
print(sorted_words)

Что здесь происходит: создаётся список пар «ключ, значение», сортируется по первому элементу пары, затем извлекаются значения.

✅ Современный вариант

# modern_sort.py
words = ["apple", "banana", "kiwi", "grape"]
sorted_words = sorted(words, key=len)
print(sorted_words)

Что улучшилось: функция sorted с key= делает то же самое в одну строку. Код понятнее и меньше подвержен ошибкам.

🕰️ Когда старый подход ещё встречается

  • Кодовые базы на Python 3.7–3.8, где встроенные generic-типы недоступны.
  • Учебные материалы, объясняющие внутреннее устройство фильтрации.
  • Ситуации, когда нужна дополнительная логика внутри цикла, которую сложно выразить через filter или comprehension.