📜 Старый подход: цикл по индексам
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.