파이썬에서 입력값을 정수로 받는 방법


왜 아래의 코드는 입력값을 정수로 받지 못하나요? 제가 찾아본 바로는 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
  • 2016년 06월 14일에 작성됨

조회수 875


1 답변


좋아요
0
싫어요
채택취소하기

파이썬 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에 저장이 된 것이죠. inputraw_inputeval 함수와 함께 사용한 것과 동일하다고 보시면 됩니다.

>>> 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를 없애고 breakwhile True를 사용하면 됩니다.

  • 2016년 06월 15일에 작성됨

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close