How can I read inputs as numbers?
input, int, python, python-2.7, python-3.x
Solution
Since Python 3, `input` returns a string which you have to explicitly convert to `int`, like this
x = int(input("Enter a number: "))
y = int(input("Enter a number: "))
You can accept numbers of any base like this
>>> data = int(input("Enter a number: "), 8)
Enter a number: 777
>>> data
511
>>> data = int(input("Enter a number: "), 16)
Enter a number: FFFF
>>> data
65535
>>> data = int(input("Enter a number: "), 2)
Enter a number: 10101010101
>>> data
1365
The second parameter tells it the base of the number and then internally it understands and converts it. If the entered data is wrong it will throw a `ValueError`.
>>> data = int(input("Enter a number: "), 2)
Enter a number: 1234
Traceback (most recent call last):
File "<input>", line 1, in <module>
ValueError: invalid literal for int() with base 2: '1234'
For values that can have a fractional component, the type would be `float` rather than `int`:
x = float(input("Enter a number:"))
Differences between Python 2 and 3
Summary
- Python 2's `input` function evaluated the received data, converting it to an integer implicitly (read the next section to understand the implication), but Python 3's `input` function does not do that anymore.
- Python 2's equivalent of Python 3's `input` is the `raw_input` function.
Python 2.x
There were two functions to get user input, called `input` and `raw_input`. The difference between them is, `raw_input` doesn't evaluate the data and returns as it is, in string form. But, `input` will evaluate whatever you entered and the result of evaluation will be returned. For example,
>>> import sys
>>> sys.version
'2.7.6 (default, Mar 22 2014, 22:59:56) \n[GCC 4.8.2]'
>>> data = input("Enter a number: ")
Enter a number: 5 + 17
>>> data, type(data)
(22, <type 'int'>)
The data `5 + 17` is evaluated and the result is `22`. When it evaluates the expression `5 + 17`, it detects that you are adding two numbers and so the result will also be of the same `int` type. So, the type conversion is done for free, and `22` is returned as the result of the `input` and stored in the `data` variable. You can think of `input` as the `raw_input` composed with an `eval` call.
>>> data = eval(raw_input("Enter a number: "))
Enter a number: 5 + 17
>>> data, type(data)
(22, <type 'int'>)
Note: You should be careful when you are using `input` in Python 2.x. I explained why one should be careful when using it, in this answer.
But, `raw_input` doesn't evaluate the input and returns as it is, as a string.
>>> import sys
>>> sys.version
'2.7.6 (default, Mar 22 2014, 22:59:56) \n[GCC 4.8.2]'
>>> data = raw_input("Enter a number: ")
Enter a number: 5 + 17
>>> data, type(data)
('5 + 17', <type 'str'>)
Python 3.x
Python 3.x's `input` and Python 2.x's `raw_input` are similar and `raw_input` is not available in Python 3.x.
>>> import sys
>>> sys.version
'3.4.0 (default, Apr 11 2014, 13:05:11) \n[GCC 4.8.2]'
>>> data = input("Enter a number: ")
Enter a number: 5 + 17
>>> data, type(data)
('5 + 17', <class 'str'>)
Problem
Why are `x` and `y` strings instead of ints in the below code? (Note: in Python 2.x use `raw_input()`. In Python 3.x use `input()`. `raw_input()` was renamed to `input()` in Python 3.x) ``` play = True while play: x = input("Enter a number: ") y = input("Enter a number: ") print(x + y) print(x - y) print(x * y) print(x / y) print(x % y) if input("Play again? ") == "no": play = False ```