⚖️ Старый vs Новый: практикум на условиях

⚡ Кратко

Решения из источника уже написаны на Python 3 и в целом корректны, но их можно сделать короче и читабельнее. Современные практики: f-strings вместо конкатенации, цепочные сравнения вместо if a < b and b < c, guard clauses вместо вложенности, тернарный оператор для простого выбора, проверка истинности строки вместо text == "".

  • f-strings делают вывод понятнее.
  • Цепочные сравнения сокращают условия.
  • Guard clauses делают код плоским.
  • Тернарный оператор заменяет длинные if-else для одного значения.

f-strings вместо конкатенации

В PDF для вывода используется конкатенация строк с запятой в print(). Это работает, но f-strings (Python 3.6+) дают более читаемый и гибкий формат.

📄 examples/old_vs_new_output.py
# Из источника
num1 = 8
num2 = 4
print("Большее число:", "num1")  # ошибка: выводит слово "num1", а не значение

# Современный вариант
print(f"Большее число: {num1}")

# Ещё короче: тернарный оператор + f-string
print(f"Большее число: {max(num1, num2)}")
⚠️ Важно: В PDF решении задачи 2 допущена типичная ошибка: print("Большее число:", "num1") печатает строку "num1", а не значение переменной. Правильно — убрать кавычки: print("Большее число:", num1) или использовать f-string.

Цепочные сравнения

Для проверки упорядоченности в PDF уже используется цепочное сравнение num1 < num2 < num3 — это современный и правильный подход. Альтернативный вариант с двумя and делает код длиннее и менее читаемым.

📄 examples/old_vs_new_chained.py
# Длиннее, но эквивалентно
if num1 < num2 and num2 < num3:
    print("Упорядочены")

# Короче и ближе к математической записи
if num1 < num2 < num3:
    print("Упорядочены")

Проверка истинности строки

В задаче 6 PDF использует проверку if text:, что является идиоматичным Python. Устаревший вариант — сравнение с пустой строкой if text != "" — работает, но выглядит многословно.

📄 examples/old_vs_new_empty_string.py
# Устаревший стиль
if text != "":
    print("Строка не пуста.")

# Идиоматичный Python
if text:
    print("Строка не пуста.")

Guard clauses для вложенных условий

Если задача требует проверки нескольких независимых условий (например, часы и минуты), вложенные if увеличивают отступы. Guard clauses делают код плоским.

📄 examples/old_vs_new_guard.py
# Вложенный стиль
hours = 25
minutes = 30

if 0 <= hours < 24:
    if 0 <= minutes < 60:
        print("Корректное время.")
    else:
        print("Некорректное время.")
else:
    print("Некорректное время.")

# Плоский стиль с guard clauses
if not (0 <= hours < 24) or not (0 <= minutes < 60):
    print("Некорректное время.")
else:
    print("Корректное время.")

Тернарный оператор

Для задачи на чётность PDF показывает оба варианта: обычный if-else и тернарный оператор. Тернарный оператор уместен, когда результат — одно значение или одна строка.

📄 examples/old_vs_new_ternary.py
# Обычный if-else
if num % 2 == 0:
    result = "Чётное"
else:
    result = "Нечётное"
print(result)

# Тернарный оператор
result = "Чётное" if num % 2 == 0 else "Нечётное"
print(result)

Прогрессивный налог

Решение из PDF уже использует градиентную шкалу налога, что корректно. Можно немного улучшить читаемость, вынеся границы и ставки в константы и добавив f-strings.

📄 examples/old_vs_new_tax.py
# Улучшенный вариант с константами
TIER_1_LIMIT = 10000
TIER_2_LIMIT = 50000
TIER_1_RATE = 0.05
TIER_2_RATE = 0.10
TIER_3_RATE = 0.20

income = float(input("Введите доход: "))

if income <= TIER_1_LIMIT:
    tax = income * TIER_1_RATE
elif income <= TIER_2_LIMIT:
    tax = TIER_1_LIMIT * TIER_1_RATE + (income - TIER_1_LIMIT) * TIER_2_RATE
else:
    tax = (
        TIER_1_LIMIT * TIER_1_RATE
        + (TIER_2_LIMIT - TIER_1_LIMIT) * TIER_2_RATE
        + (income - TIER_2_LIMIT) * TIER_3_RATE
    )

print(f"Налог: {tax}")
print(f"Итоговая сумма после уплаты налога: {income - tax}")
Проверить по документации: Именованные константы (PEP 8) и f-strings описаны в официальной документации Python. Подход к вычислению градиентного налога — общая математическая практика, не привязанная к конкретной версии языка.