By Hosch250


2013-12-08 03:08:15 8 Comments

Why are x and y strings instead of ints in the below code? Everything on the web says to use raw_input(), but I read on Stack Overflow (on a thread that did not deal with integer input) that 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

17 comments

@Gregg Morgan 2019-01-13 05:55:35

play = True

while play:

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

    print(int(x) + int(y))
    print(int(x) - int(y))
    print(int(x) * int(y))
    print(int(x) / int(y))
    print(int(x) % int(y))

    if input("Play again? ") == "no":
        play = False

this makes it know that the variable 'x' and 'y' are integers and therefore uses them like integers, if you want it to be able to use decimals change 'int' to 'float'.

the output for the first function

print(int(x) + int(y))

the output where x is 3 and y is 7 is 10

@Sakith Karunasena 2018-12-26 12:30:22

Try this,

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

int() is a built-in python function that converts any datatype to a integer.

@iBug 2018-12-26 12:39:54

Welcome to Stack Overflow! Does this answer add anything new to the existing ones?

@thefourtheye 2013-12-08 03:08:57

TLDR

  • Python 3 doesn't evaluate the data received with input function, but Python 2's input function does (read the next section to understand the implication).
  • 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'>)

Solution

To answer your question, since Python 3.x doesn't evaluate and convert the data type, you have to explicitly convert to ints, 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:"))

Apart from that, your program can be changed a little bit, like this

while True:
    ...
    ...
    if input("Play again? ") == "no":
        break

You can get rid of the play variable by using break and while True.

PS: Python doesn't expect ; at the end of the line :)

@Shreyan Mehta 2016-04-09 06:19:24

Is there any other way, like a function or something so that we dont need to convert to int in 3.x other than doing explicit conversion to int??

@thefourtheye 2016-04-09 07:01:32

@ShreyanMehta eval would work, but don't go for that unless you have pressing reasons.

@Elazar 2017-11-13 01:19:36

Could you please add a tl;dr version to the beginning of the answer? It's a long answer, and I believe many will not bother to read it, and will just use input() and eval(input())

@spectras 2018-04-06 12:48:28

@thefourtheye at least use ast.literal_eval for that. It does not have the security concerns of eval.

@Chris_Rands 2018-07-24 14:36:54

I use this Q&A as a dupe target, but maybe you can add a TDLR with the python 3 solution, i.e. int(input()... at the top? Python 2 is nearing the end of it's life and the python 3 info is too buried IMO

@thefourtheye 2018-10-17 06:01:51

@Chris_Rands Sorry, it took a while. I updated with a TLDR now, PTAL.

@uday more 2018-10-14 12:51:34

play = True

while play:

    #you can simply contain the input function inside an int function i.e int(input(""))
    #This will only accept int inputs
    # and can also convert any variable to 'int' form

    x = int(input("Enter a number: "))    
    y = int(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

@Artjom B. 2018-10-14 13:11:36

While this code block may answer the question, it would be best if you could provide a little explanation for why it does so. Please edit your answer to include such a description.

@ravi tanwar 2018-08-03 16:30:31

n=int(input())
for i in range(n):
    n=input()
    n=int(n)
    arr1=list(map(int,input().split()))

the for loop shall run 'n' number of times . the second 'n' is the length of the array. the last statement maps the integers to a list and takes input in space separated form . you can also return the array at the end of for loop.

@Madhusudan chowdary 2017-06-17 13:13:06

In Python 3.x. By default the input function takes input in string format . To convert it into integer you need to include int(input())

x=int(input("Enter the number"))

@Rohit-Pandey 2017-04-16 17:35:19

Taking int as input in python: we take a simple string input using:

input()

now we want int as input.so we typecast this string to int. simply using:

int(input())

@Hemanth Savasere 2016-04-17 16:20:24

Convert to integers:

my_number = int(input("enter the number"))

Similarly for floating point numbers:

my_decimalnumber = float(input("enter the number"))

@Tobias Kienzler 2016-11-23 12:19:52

While in your example, int(input(...)) does the trick in any case, python-future's builtins.input is worth consideration since that makes sure your code works for both Python 2 and 3 and disables Python2's default behaviour of input trying to be "clever" about the input data type (builtins.input basically just behaves like raw_input).

@Harun ERGUL 2016-03-23 20:57:34

Python 3.x has input() function which returns always string.So you must convert to int

python 3.x

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

python 2.x

In python 2.x raw_input() and input() functions always return string so you must convert them to int too.

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

@Sanyal 2015-06-30 09:16:28

def dbz():
    try:
        r = raw_input("Enter number:")
        if r.isdigit():
            i = int(raw_input("Enter divident:"))
            d = int(r)/i
            print "O/p is -:",d
        else:
            print "Not a number"
    except Exception ,e:
        print "Program halted incorrect data entered",type(e)
dbz()

Or 

num = input("Enter Number:")#"input" will accept only numbers

@Waseem Akhtar 2015-02-21 11:52:32

Yes, in python 3.x, raw_input is replaced with input. In order to revert to old behavior of input use:

eval(input("Enter a number: "))

This will let python know that entered input is integer

@tjt263 2016-03-08 13:46:17

Is this correct?

@Waseem Akhtar 2016-07-03 11:26:57

Yes, you may try please

@Padraic Cunningham 2016-10-18 17:52:56

This will let python know that entered input is integer, it could be much worse things than an integer.

@user1341043 2014-11-11 00:32:38

For multiple integer in a single line, map might be better.

arr = map(int, raw_input().split())

If the number is already known, (like 2 integers), you can use

num1, num2 = map(int, raw_input().split())

@gumboy 2014-07-08 00:13:18

Multiple questions require input for several integers on single line. The best way is to input the whole string of numbers one one line and then split them to integers.

 p=raw_input()
    p=p.split()      
    for i in p:
        a.append(int(i))

@Aravind 2014-05-23 11:32:22

I encountered a problem of taking integer input while solving a problem on CodeChef, where two integers - separated by space - should be read from one line.

While int(input()) is sufficient for a single integer, I did not find a direct way to input two integers. I tried this:

num = input()
num1 = 0
num2 = 0

for i in range(len(num)):
    if num[i] == ' ':
        break

num1 = int(num[:i])
num2 = int(num[i+1:])

Now I use num1 and num2 as integers. Hope this helps.

@Hosch250 2014-05-23 16:33:19

This looks very interesting. However, isn't i destroyed when the for loop is exited?

@Aravind 2014-05-24 15:18:11

@hosch250 When a loop is exited, the value of the index variable (here, i) remains. I tried this piece out, and it works correctly.

@Mathias Ettinger 2018-07-12 12:58:38

For this kind of input manipulation, you can either num1, num2 = map(int, input().split()) if you know how much integers you will encounter or nums = list(map(int, input().split())) if you don't.

@iCodez 2013-12-08 03:09:11

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: "))
y = int(input("Enter a number: "))

Also, Python does not need/use semicolons to end lines. So, having them doesn't do anything positive.

@MJM 2018-07-24 11:03:39

Nice short answer. There seems to be lots of confusion over what's in Py3x and what's not! Here are the docs for input() [link]docs.python.org/3/library/functions.html#input

@Rodrigo Laguna 2018-11-12 15:14:58

this works well, up to a point... if you enter an string (like 'foo') it'll raise ValueError:invalid literal for int() with base 10.... so you need to check before if it's actually an integer (or catch the exception). My question is, what is a pythonic way to do this?

@Martijn Pieters 2013-12-08 03:09:10

input() (Python 3) and raw_input() (Python 2) always return strings. Convert the result to integer explicitly with int().

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

Pro tip: semi-colons are not needed in Python.

Related Questions

Sponsored Content

43 Answered Questions

[SOLVED] How do I convert a String to an int in Java?

17 Answered Questions

[SOLVED] How can I make a time delay in Python?

25 Answered Questions

[SOLVED] How do I list all files of a directory?

  • 2010-07-08 19:31:22
  • duhhunjonn
  • 2960975 View
  • 3259 Score
  • 25 Answer
  • Tags:   python directory

6 Answered Questions

[SOLVED] How to get the number of elements in a list in Python?

  • 2009-11-11 00:30:54
  • y2k
  • 2949099 View
  • 1722 Score
  • 6 Answer
  • Tags:   python list

36 Answered Questions

[SOLVED] How do I check if a list is empty?

  • 2008-09-10 06:20:11
  • Ray Vega
  • 2061315 View
  • 3082 Score
  • 36 Answer
  • Tags:   python list

25 Answered Questions

[SOLVED] How can I safely create a nested directory in Python?

40 Answered Questions

[SOLVED] How do I check whether a file exists without exceptions?

33 Answered Questions

[SOLVED] How to read a file line-by-line into a list?

44 Answered Questions

[SOLVED] How to merge two dictionaries in a single expression?

43 Answered Questions

[SOLVED] How can I represent an 'Enum' in Python?

Sponsored Content