파이썬에서 입력값을 정수로 받는 방법
조회수 33060회
왜 아래의 코드는 입력값을 정수로 받지 못하나요? 제가 찾아본 바로는 raw_input()
을 사용하는 것이 맞지만 파이썬 3.x부터는 raw_input()
이 input()
으로 바뀌었다고 하던데 말이죠.
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
1 답변
-
파이썬 2.x
파이썬 2.x에서는 사용자 입력값을 받는 함수가 두가지 있었습니다. 하나는
input
이고 다른 하나는raw_input
이죠. 둘의 차이는raw_input
은 입력값을 그저 그 상태의 문자열로서 받아들이고,input
은 입력값을 평가하여 그 결과를 반환해준다는 점입니다. 예를 들어,>>> 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'>)
입력값
5+17
이 평가되어22
로 반환되는 것을 볼 수 있죠. 여기서5+17
이 평가된다는 것은, 두개의 숫자를 더하고자 한다는 것을 감지하여 결과를int
타입으로 결정한다는 것입니다. 따라서input
의 결과가22
가 되어 변수data
에 저장이 된 것이죠.input
은raw_input
을eval
함수와 함께 사용한 것과 동일하다고 보시면 됩니다.>>> data = eval(raw_input("Enter a number: ")) Enter a number: 5 + 17 >>> data, type(data) (22, <type 'int'>)
참고 : 파이썬 2.x에서
input
을 사용할 때는 주의해야할 필요가 있습니다. 그 이유는 이 답변에 자세히 설명되어있습니다.어쨌든,
raw_input
은 이와 달리 입력값을 따로 평가하지 않고 입력된 문자열 자체로 반환합니다.>>> 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'>)
파이썬 3.x
파이썬 3.x에서의
input
은 파이썬 2.x에서의raw_input
과 비슷하며raw_input
은 파이썬 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'>)
해결방법
질문에 답해드리자면, 파이썬 3.x에서는 입력값을 따로 평가하여 데이터 타입을 바꿔주지 않기 때문에 직접 타입을
int
함수를 이용하여int
로 바꿔야 합니다.x = int(input("Enter a number: ")) y = int(input("Enter a number: "))
또한,
int
함수는 어떠한 진법의 입력값도 허용하며 이를 10진수로 바꿔줍니다.>>> 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
두번째 매개변수는 입력되는 숫자의 진법을 알려주며, 함수는 이를 인지하여 10진수로 변환해주죠. 만약 입력된 값이 잘못되었다면
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'
질문과는 별개로, 작성하신 프로그램을 이런식으로 바꿀 수 있을 것 같네요.
while True: ... ... if input("Play again? ") == "no": break
변수
play
를 없애고break
와while True
를 사용하면 됩니다.
댓글 입력