Python: Magic numbers
Let's look at our example of the program that calculates exchange rates:
euros_count = 1000 dollars_count = euros_count * 1.25 # 1250.0 rubles_count = dollars_count * 60 # 75000.0 print(rubles_count)
From professional development's perspective, such code doesn't correspond with the best practices.
In this example, it's difficult to understand what the numbers
1.25 mean. Imagine having to deal with that code a month or a year from now – it's going to be difficult. It'll also be difficult for a programmer who hasn't seen the code before.
In our example, the context is easy to put together because the variables are named correctly. But in real projects, code is much more complicated, so it's often impossible to guess the meaning of the numbers.
The problem lies in magic numbers. These are numbers whose origin is impossible to understand at a glance – you have to dig deep into what's going on in the code.
To prevent this problem, you need to create variables with the right names. That way, everything will fall into place:
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)
In this program:
- Snake_case naming is used
- The two new variables are separated from the subsequent calculations by a blank line. These variables make sense without calculations, so this separation is appropriate because it increases readability
- The resulting code is well named and structured, but it's longer than the previous version. This is often the case, but this is fine because the code must be readable
Magic numbers and obscure variable names don't break the code, but make it less readable.
It's important to understand that in any case, the computer will carry out the calculation you give it. However, another programmer reading the code won't understand, thus complicating your work. Naming the variables properly is half the battle when it comes to code analysis.
You've come across this code, which prints the total number of rooms owned by the present king:
king = "Rooms in King Balon's Castle:" print(king) print(6 * 17)
As you can see, there are some magic numbers here: it's unclear what 6 is and what 17 is. If you know the history of the royal family, you can guess: each new king inherits all his ancestors 'castles and builds a new one, an exact copy of his parents'.
This strange dynasty simply breeds identical castles...
Get rid of the magic numbers by creating new variables and then displaying the text on the screen.
You'll get this:
Rooms in King Balon's Castle: 102
The variable names should give the meaning of the numbers, but should also be short and succinct enough to be readable.
Note: The code will work with any name, and we only check the printed result, so the task is up to you.
The exercise doesn't pass checking. What to do? 😶
If you've reached a deadlock it's time to ask your question in the «Discussions». How ask a question correctly:
- Be sure to attach the test output, without it it's almost impossible to figure out what went wrong, even if you show your code. It's complicated for developers to execute code in their heads, but having a mistake before their eyes most probably will be helpful.
In my environment the code works, but not here 🤨
Tests are designed so that they test the solution in different ways and against different data. Often the solution works with one kind of input data but doesn't work with others. Check the «Tests» tab to figure this out, you can find hints at the error output.
My code is different from the teacher's one 🤔
It's fine. 🙆 One task in programming can be solved in many different ways. If your code passed all tests, it complies with the task conditions.
In some rare cases, the solution may be adjusted to the tests, but this can be seen immediately.
I've read the lessons but nothing is clear 🙄
It's hard to make educational materials that will suit everyone. We do our best but there is always something to improve. If you see a material that is not clear to you, describe the problem in “Discussions”. It will be great if you'll write unclear points in the question form. Usually, we need a few days for corrections.
By the way, you can participate in courses improvement. There is a link below to the lessons course code which you can edit right in your browser.