2012-04-01 10 views
-1

내가 할 수없는 것 같습니다. 약간 수정이 필요한 커다란 프로그램이 있습니다.사용자 옵션 확인 - Python

사용자가 유효한 옵션을 입력해야만 계속 진행할 수 있습니다. '1', '2', '3', '4'이외는 유효하지 않습니다.

def GetResponse(): 
    global Response 
    Response = (input("Enter Option number: ")) 

이것이 코드 인 경우 아무거나 입력해도 메뉴가 계속 표시됩니다. 메뉴가 나오기를 계속하는 것 외에는 아무 일도 일어나지 않습니다. 나는 그것을 약간 수정 만 응답 정수 할 경우 (문자열 또는 숫자) :하지만,

def GetResponse(): 
    global Response 
    Response = (int(input("Enter Option number: "))) 

그런 다음 여기를 유효한 옵션은 내가 텍스트의 일부를 입력하면 반면이 해당 옵션으로 이동 입력 한 경우 (내가 알고있는 것으로 예상 됨) 오류가 발생했습니다.

내가 혼란스러워하는 이유는 내가 int로 변경하면 입력 한 옵션에만 응답하는 반면, int를 가져 가면 얻을 수 있습니다. 오류는 없지만 프로그램은 유효한 입력에 응답하지 않습니다.

이 정보가 분명하지 않은 경우 죄송합니다. 내가 설명 할 수있는 가장 좋은 방법이야. 실제 응답

+4

들여 쓰기가 잘못되었습니다. 또한 우리는 보통 변수와 함수에'lower_case'를 사용하여 클래스에'CamelCase'를 예약합니다. 또한 전역 변수를 수정하는 대신 응답을 보내는 것이 좋습니다. – katrielalex

+0

@ katrielalex의 제안에 대해 자세히 설명합니다. 전역은 좋지 않습니다. 프로그램의 모든 부분에서 프로그램의 다른 부분에서 사용되는 값을 수정할 수있는 코딩 스타일을 권장합니다. 이로 인해 코드의 한 부분에서 값을 변경하면 예상하지 못했을 때 문제가 발생하고 프로그램 전체가 불어납니다. –

+0

코드가 구문 검사를 통과 할 수 있도록 들여 쓰기를 수정했습니다. –

답변

0

정수와 문자/문자열은 파이썬에서 다른 유형입니다. 예를 들어, '1'1과 같지 않습니다.

if 1 <= input <= 4: 
    # Valid input, find the menu 

... 다음 정수를 확인하고 있습니다 :

은 메뉴 옵션 같은 것을 보았다합니다.

희망이 되셨습니다.

+0

또는 부동 소수점 또는 Python에서 지원하는 다른 숫자 유형 중 하나. 재미있는 버그는 사용자가 "1"또는 "5"를 입력하고 "bacon sandwich"와 같은 입력을 올바르게 거부하면 잘 작동하지만 "1.5"와 같은 사용자 입력에 대해서는 문제가되는 코드입니다. –

2

Python 2.x에서 input은 입력 된 텍스트를 평가합니다. int은 정수로 변환 할 수없는 것을 전달하면 ValueError를 발생시킵니다.

숫자가 작동하는 이유는 숫자가 숫자로 평가된다는 것입니다. 마치 파이썬 명령 줄 에서처럼 숫자가 숫자로 평가된다는 것입니다. 예를 들어 print "hello world"을 입력하면 zzzz을 입력 한 것과 같은 오류가 발생하지 않습니다. 첫 번째는 유효한 파이썬이고 두 번째는 유효하지 않습니다.

raw_input을 사용하는 것이 더 합리적 일 것입니다. 왜냐하면 파이썬 인터프리터가 입력 된 텍스트를 해석하기를 원하지 않기 때문입니다. 사용자가 import sys; sys.exit()을 입력하면 어떻게 될까요?

여기에 할 일은 입력을 받아 int로 변환하고 오류가 발생하면 다시 프롬프트하는 것입니다.

choice = None 
while not choice: 
    val = raw_input("Enter Option Number: ") 
    try: 
     choice = int(val) 
    except ValueError: 
     print("Must be an integer 1 to 4") 
+1

파이썬 3을 사용합니다. raw_input을 사용하지 않습니다? –

+0

예. 'input'을'raw_input'으로 대체 할 수 있습니다. 대부분의 사람들은 python 2.X를 사용합니다. 파이썬 3.X에 대한 도움이 필요하면 적절한 태그를 제공하십시오. – Simon

+0

@JoeTaylor : Ah - Py3k. 많이 설명합니다. 여러분이 파이썬 3을 사용하고 있다고 말하지 않는다면, 우리는 일반적으로 여러분이 파이썬 2 (상당히 다릅니다)를 사용한다고 가정하고 파이썬 2에 적용되는 조언을 제공 할 것입니다. 이와 같은 질문에 대해서는 매우 중요합니다. * 항상 * 파이썬 3을 사용하고 있다면 알려주세요. –

0

다른 answer of mine에서 표절 : 파이썬 2.7, input()에서

당신이 사용자 입력을 얻기 위해 원하는 것이 아니다. 실제로는 raw_input()을 원합니다. (실제로, 은 혼란스러운이며, Python 3에서 수정되었습니다.)

차이점은 input()이 대화 형 Python 세션에 명령으로 입력 한 것처럼 사용자 입력을 받아서 을 평가하려고한다는 것입니다. 함수 호출과 표현식이 평가되어 어떤 "무엇?" 순간 당신은 범용 사용자 입력을 사용하려고하면 :

In [18]: my_number = input("Please enter a number >> ") 
Please enter a number >> locals() # unexpected user input 

In [19]: print (my_number) 
{'disp': <function disp at 0x029FBEB0>, 'all': <function all at 0x0290BA70>, 
'dist': <function dist at 0x030D1430>, 'issubsctype': <function issubsctype 
at 0x028FADF0>, 'sca': <function sca at 0x062AF370>, 'savez': <function 
savez at 0x02A8E830>, 'entropy': <function entropy at 0x030C8F70>, 
'restoredot': <built-in function restoredot>, 'ptp': <function ptp at 
0x0290BB30>, 'Subplot': <class 'matplotlib.axes.AxesSubplot'>, 'frange': 
<function frange at 0x030D1930>, 'PackageLoader': <class 
numpy._import_tools.PackageLoader at 0x0248C8B8>, 'rec2csv': 
<function rec2csv at 0x030FE4B0>, 'ylabel': <function ylabel at 0x062AF6F0>, .... 
# what?! 

대신, 다음, 입력에 대한 사용자 요구가 문자열로 입력 된대로 반환 raw_input()를 사용합니다.

input()raw_input()에 대한 설명서를 읽으면이를 명확히하는 데 도움이 될 수 있습니다.


아, 당신이이 경우 파이썬 3를 사용하고는 approach I suggested in the other question를 시도 - 그것은 유효한 사용자 입력을 때까지 영원히 루프 함수를 정의하고 반환

(따라서 루프를 깨는.) float를 얻기위한 Python 2.x 코드 : Python 3에 적합하고 int를 얻습니다. (이것은 당신에게 사소한 연습으로 남겨져 있습니다.)

def get_float_from_user (prompt): 
    while True: 
     try: 
      user_input = float(raw_input(prompt)) 
      return user_input 
     except ValueError: 
      print ("Not a floating point number. Please try again.") 

x = get_float_from_user("Enter x.") 
y = get_float_from_user("Enter y.") 

print (x+y)