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

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

Классический: прямые циклы while, конкатенация строк и дублирование input() — понятно новичкам.

Современный: f-strings, guard clauses и оператор «морж» := убирают дублирование и делают код короче.

Вывод: оба стиля работают, но современный читабельнее и легче поддерживается.

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

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

📄 examples/classic_sum.py
num = int(input("Введите число: "))
sum_result = 0
i = 1

while i <= num:
    sum_result += i
    i += 1

print("Сумма чисел от 1 до", num, "=", sum_result)

Что здесь происходит: инициализация счётчика, цикл с условием и ручное обновление переменной. Вывод через запятые в print автоматически добавляет пробелы.

❌ Что можно улучшить

  • Конкатенация строк через запятые: print("a", b) работает, но f-string нагляднее.
  • Дублирование input(): в циклах с предусловием приходится читать ввод до цикла и в конце тела.
  • Вложенные условия: без guard clauses код уходит вправо.

✅ Рекомендуемый современный вариант

1. f-strings вместо запятых

📄 examples/modern_sum.py
num = int(input("Введите число: "))
sum_result = 0
i = 1

while i <= num:
    sum_result += i
    i += 1

print(f"Сумма чисел от 1 до {num} = {sum_result}")

Что улучшилось: одна строка формата вместо нескольких аргументов print. Читается как естественное предложение.

2. Оператор «морж» для чтения ввода

В задаче кассы пользователь вводит цены до 0. Классический способ дублирует input(), современный — использует :=.

📄 examples/modern_cash_register.py
import math

total = 0.0

while (price := float(input("Enter price (0 to finish): "))) != 0:
    total += price

rounded_total = round(total)
payment = math.ceil(rounded_total / 100) * 100
change = payment - rounded_total

print(f"Total: {rounded_total} euro")
print(f"Paid: {payment} euro")
print(f"Change: {change} euro")

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

3. Guard clauses

Вместо вложенных if-else внутри цикла проверяйте исключительные случаи в начале.

📄 examples/modern_income.py
income = 0
expenses = 0

while True:
    raw = input("Enter income/expense (0 to finish): ")
    value = float(raw)
    if value == 0:
        break
    if value > 0:
        income += value
    else:
        expenses += abs(value)

balance = income - expenses
print(f"Income: {income}")
print(f"Expenses: {expenses}")
print(f"Balance: {balance}")
Преимущества современного стиля:
  • Меньше дублирования.
  • Условия читаются как правила.
  • f-strings быстрее и нагляднее.
  • Меньше вложенности — меньше ошибок с отступами.

🕰️ Когда классический подход ещё уместен

Классические циклы с явной инициализацией, условием и инкрементом остаются лучшим способом объяснить логику новичкам. Оператор := требует Python 3.8+, поэтому в учебных целях важно сначала освоить базовый паттерн, а затем переходить к современным сокращениям.