📜 Классический подход из занятия
Исходные решения используют явные циклы и аккумуляторы. Это помогает понять, как работает алгоритм «под капотом».
1. Накопление чисел, делящихся на 3
📄 examples/classic_divisible_by_three.py
n = int(input("Введите число: "))
numbers = []
for i in range(n + 1):
if i % 3 == 0:
numbers.append(i)
for num in numbers:
print(num)
2. Средняя длина имён
📄 examples/classic_average_length.py
names = ["John", "Bob", "Alice", "Anna", "Mark"]
sum_len = 0
for name in names:
sum_len += len(name)
average_length = sum_len / len(names)
print("Список имён:", names)
print("Средняя длина имён:", average_length)
print("Имена длиннее средней длины:")
for name in names:
if len(name) > average_length:
print(name)
3. Поиск индекса вручную
📄 examples/classic_index_loop.py
items = ["apple", "banana", "cherry"]
for i in range(len(items)):
print(f"{i}: {items[i]}")
✅ Рекомендуемый современный вариант
1. List comprehension для делимости на 3
📄 examples/modern_divisible_by_three.py
n = int(input("Введите число: "))
numbers = [i for i in range(n + 1) if i % 3 == 0]
for num in numbers:
print(num)
2. Средняя длина через sum() и generator expression
📄 examples/modern_average_length.py
names = ["John", "Bob", "Alice", "Anna", "Mark"]
average_length = sum(len(name) for name in names) / len(names)
long_names = [name for name in names if len(name) > average_length]
print("Список имён:", names)
print("Средняя длина имён:", average_length)
print("Имена длиннее средней длины:")
for name in long_names:
print(name)
3. Индекс и значение через enumerate()
📄 examples/modern_enumerate.py
items = ["apple", "banana", "cherry"]
for i, item in enumerate(items):
print(f"{i}: {item}")
4. Возведение нечётных чисел в квадрат
📄 examples/modern_square_odd.py
numbers = [4, 9, 1, 7, 2, 5, 0, 3, 7, 1, 3]
squared = [n ** 2 if n % 2 else n for n in numbers]
print(squared)
Преимущества современного стиля:
- Меньше кода — меньше возможностей для ошибок.
sum()и генераторные выражения работают быстрее ручных циклов.enumerate()делает код чище, чемrange(len(...)).- List comprehensions часто читаются как математическая нотация множеств.
🕰️ Когда классический подход всё ещё полезен
- На начальном этапе обучения — чтобы понять, как устроен алгоритм.
- Когда тело цикла сложное и comprehension сделал бы код нечитаемым.
- Когда нужен ранний выход (
break) или сложная логика внутри цикла.
🔧 Как распознать устаревший код
Если вы видите пустой список и цикл только для наполнения его простым условием, это часто можно заменить:
numbers = [1, 2, 3, 4, 5, 6]
result = []
for x in numbers:
if x % 2 == 0:
result.append(x)
print("classic:", result)
# → modern
result = [x for x in numbers if x % 2 == 0]
print("modern:", result)
Если нужно просуммировать значения по списку:
words = ["apple", "pie", "banana"]
total = 0
for word in words:
total += len(word)
print("classic total length:", total)
# → modern
total = sum(len(word) for word in words)
print("modern total length:", total)
Проверить по документации: list comprehensions, генераторные выражения и
enumerate() выходят за рамки исходного занятия. Подробности — в разделе Ресурсы.