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

조회수 28259회

왜 아래의 코드는 입력값을 정수로 받지 못하나요? 제가 찾아본 바로는 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 답변

  • 좋아요

    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를 사용하면 됩니다.

답변을 하려면 로그인이 필요합니다.

Hashcode는 개발자들을 위한 무료 QnA 사이트입니다. 계정을 생성하셔야만 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)

ᕕ( ᐛ )ᕗ
로그인이 필요합니다

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 계정을 생성하셔야만 글을 작성하실 수 있습니다.