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

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

Классический: явные циклы for, аккумуляторы (total = 0, пустые списки), ручная проверка индексов — понятно новичкам, но многословно.

Современный: list comprehensions, генераторные выражения, enumerate(), sum(), guard clauses и f-strings.

Вывод: классический подход оставьте для понимания алгоритма; в реальном коде предпочитайте встроенные инструменты Python.

📜 Классический подход из занятия

Исходные решения используют явные циклы и аккумуляторы. Это помогает понять, как работает алгоритм «под капотом».

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() выходят за рамки исходного занятия. Подробности — в разделе Ресурсы.