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

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

Старый: циклы по индексам, промежуточные списки и вложенные циклы для комбинаций.

Новый: протокол итерации, генераторные выражения и itertools.

Вывод: современный код короче, безопаснее и экономит память.

📜 Старый подход: цикл по индексам

numbers = [10, 20, 30]

i = 0
while i < len(numbers):
    print(numbers[i])
    i += 1

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

❌ Почему этот подход может быть не лучшим

  • Лишняя переменная и арифметика индекса.
  • Не работает напрямую с множествами, словарями и файлами.
  • Легко допустить ошибку Off-by-one.

✅ Современный вариант: цикл for по итератору

numbers = [10, 20, 30]

for num in numbers:
    print(num)
Преимущества:
  • Читается как естественный язык: «для каждого числа в числах».
  • Работает с любыми итерируемыми объектами.
  • Python сам вызывает iter() и ловит StopIteration.

📜 Старый подход: промежуточный список

numbers = range(1000)
result = []

for n in numbers:
    if n % 2 == 0:
        result.append(n ** 2)

print(sum(result))

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

numbers = range(1000)
total = sum(n ** 2 for n in numbers if n % 2 == 0)
print(total)
Преимущества:
  • Не создаёт промежуточный список на 500 элементов.
  • Код компактнее и выразительнее.
  • Функция sum() получает элементы по одному.

📜 Старый подход: вложенные циклы для комбинаций

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

for cloth in clothes:
    for color in colors:
        for size in sizes:
            print(f"{cloth} - {color} - {size}")

✅ Современный вариант: itertools.product

import itertools

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

for cloth, color, size in itertools.product(clothes, colors, sizes):
    print(f"{cloth} - {color} - {size}")
Преимущества:
  • Количество уровней вложенности не влияет на читаемость.
  • Легко добавить новое измерение, передав ещё один аргумент.

🕰️ Когда старый подход ещё можно встретить

Код с индексами может появляться в старых проектах или при работе с API, где нужен индекс элемента. В таких случаях предпочитайте enumerate() вместо ручного счётчика.

Проверить по документации: сравнение стилей и рекомендации по использованию генераторов в стандартной библиотеке выходят за рамки исходного материала. Ознакомьтесь с разделами Iterator Types, Generator Expressions и itertools в официальной документации Python.