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 ```

Original source

Related problems