📜 Классический подход из источника
Исходный материал использует базовые конструкции без дополнительных приёмов. Это хорошая основа для понимания, но код получается многословным.
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 вместо запятых
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(), современный — использует :=.
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 внутри цикла проверяйте исключительные случаи в начале.
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+, поэтому в учебных целях важно сначала освоить базовый паттерн, а затем переходить к современным сокращениям.