Python: Магические числа

Рассмотрим пример программы, которая выполняет конвертацию валют:

euros_count = 1000
dollars_count = euros_count * 1.25  # 1250.0
rubles_count = dollars_count * 60   # 75000.0

print(rubles_count)

С технической точки зрения — всё работает. Но с точки зрения профессиональной разработки такой код считается плохой практикой.

🤨 В чём проблема?

В выражениях использованы непонятные числа: 1.25 и 60. Что это за значения? Курс валют? Откуда они взялись? Через месяц или год вы, скорее всего, не вспомните, что именно означают эти числа. А если код откроет другой разработчик, он просто не поймёт, откуда всё берётся.

🔍 Такие значения называют «магическими числами»

Магические числа (magic numbers) — это числовые значения, смысл которых не ясен из кода. Чтобы понять их назначение, приходится вникать в контекст или читать дополнительную документацию. Магические числа затрудняют чтение, понимание и поддержку кода.

✅ Как избежать магии

Самый простой способ — вынести такие значения в переменные с понятными именами. Тогда смысл станет очевиден:

dollars_per_euro = 1.25
rubles_per_dollar = 60

euros_count = 1000
dollars_count = euros_count * dollars_per_euro      # 1250.0
rubles_count = dollars_count * rubles_per_dollar    # 75000.0

print(rubles_count)

📌 Что изменилось?

  • Значения вынесены в отдельные переменные с осмысленными именами.
  • Используется snake_case — стандарт стиля в Python.
  • Отделили данные от логики: сначала определили курсы, потом сделали вычисления.
  • Добавили пустую строку между «исходными данными» и вычислениями — это повышает читаемость.
  • Программа стала немного длиннее, но понятнее. И это — норма.

💬 Вывод

Магические числа делают код непонятным и трудным для поддержки. Чтобы избежать этой проблемы, нужно заменять такие числа переменными с осмысленными именами. Это делает код более читаемым, особенно в долгосрочной перспективе. Не стоит бояться того, что программа станет чуть длиннее — понятный код всегда важнее компактности.

Задание

Вы столкнулись с таким кодом, который выводит на экран общее количество комнат во владении нынешнего короля:

king = "Rooms in King Balon's Castles:"
print(king)
print(6 * 17)

Как видите, это магические числа: непонятно, что такое 6 и что такое 17. Можно догадаться, если знать историю королевской семьи: каждый новый король получает в наследство все замки от предков и строит новый замок — точную копию родительского.

Эта странная династия просто плодит одинаковые замки…

Избавьтесь от магических чисел, создав новые переменные, а затем выведите текст на экран.

Получится так:

Rooms in King Balon's Castles:
102

Названия переменных должны передавать смысл чисел, но должны при этом оставаться достаточно короткими и ёмкими для комфортного чтения.

Помните: код будет работать с любыми названиями, а наша система всегда проверяет только результат на экране, поэтому выполнение этого задания — под вашу ответственность.

Как с вами связаться? 🙃

Команда проекта находится в телеграм-сообществе по ссылке https://ttttt.me/HexletLearningBot. Там можно задать любой вопрос и повлиять на проект

Упражнение не проходит проверку — что делать? 😶

Если вы зашли в тупик, то самое время поговорить с нашим асситентом Тота во вкладке "ИИ-помощник". Как правильно задать вопрос:

В моей среде код работает, а здесь нет 🤨

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

Мой код отличается от решения учителя 🤔

Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи. В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.

Прочитал урок — ничего не понятно 🙄

Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в обратной связи нашего сообщества

Нашли ошибку? Есть что добавить? Пулреквесты приветствуются

Привет! Я Тота и моя задача помочь в обучении. Чтобы активировать меня, нужно зарегистрироваться или залогиниться, если у вас уже есть аккаунт

Loading...

Ваше упражнение проверяется по этим тестам

1from hexlet.test import expect_output
2
3
4def test(capsys):
5    expected = "Rooms in King Balon's Castles:\n102"
6    expect_output(capsys, expected)
7

Решение учителя откроется через:

20:00
waiting_clock