# How can I read inputs as numbers?

Viewed 995.74 k times

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

### Solution

Since Python 3, `input` returns a string which you have to explicitly convert to `int`s, with `int`, like this

``````x = int(input("Enter a number: "))
y = int(input("Enter a number: "))
``````

You can accept numbers of any base and convert them directly to base-10 with the `int` function, 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 what is the base of the numbers entered 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 `input` and stored in `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'>)
``````
##### joey30

In Python 3.x, `raw_input` was renamed to `input` and the Python 2.x `input` was removed.
This means that, just like `raw_input`, `input` in Python 3.x always returns a string object.
To fix the problem, you need to explicitly make those inputs into integers by putting them in `int`:
``````x = int(input("Enter a number: "))