2012-02-25 1 views
0

사용자가 여러 옵션 중 하나를 선택할 수있는 Python 3 코드를 작성하려고합니다. 나는이 여러 가지 방법을 시도해 봤지만 아무도 올바른 방법을 찾지 못합니다.Python 3 : 사용자 선택을위한 함수 만들기

예 시도 :이와

usr_input = input("Input: ") 
while (usr_input != '1') | (usr_input != '2'): 
    if usr_input == '1': 
     search() 
    elif usr_input == '2': 
     sys.exit() 

문제는 스크립트가 잘못된 명령을 입력 한 후 달려 있다는 것입니다.

누구든지 올바른 방법을 제공 할 수 있습니까?

+0

당신이 '어떻게 생각하십니까 |'연산자는 무엇입니까? '>>>'프롬프트에서 시도해 보셨습니까? '(usr_input! = '1') |이 표현을 어떻게 시도했는지에 대한 설명을 게시 해주십시오. (usr_input! = '2')'가 작동해야합니다. 이것의 뒤에 당신의 추론을 설명하는 것이 중요합니다. –

답변

2

여기에 몇 가지 문제가 있습니다.

먼저 루프 외부에서 usr_input을 한 번만받습니다. 올바른 선택이 아니라면 선택을 수정하는 변경 사항을 사용자에게주지 마십시오. 단순히 반복합니다. 루프 내에서 input을 수행해야합니다.

두 번째로, 부울 조건이 잘못되었습니다. x가 a 또는 b가 아님을 나타내는 것과 같습니다. 항상이 참 이니 a 이어도 여전히 b이 아니기 때문입니다. 그것을 말하는 더 좋은 방법은 not in ['1', '2']입니다.

이 함께 퍼팅 :

usr_input = '' 
while usr_input not in ['1', '2']: 
    usr_input = input("Input: ") 
    ... etc... 
+0

'not in list'모드를 선호합니다. –

+0

@orangeoctopus에서 제안한 것과 반대되는'not in list' 방법을 사용하는 이유가 있습니까? 아니면 개인적인 취향입니까? –

+0

usr_input을 두 번 이상 입력하지 않고'[ '1', '2', '3', '4']'와 같은 더 많은 옵션으로 확장 할 수 있기 때문에 좋습니다. 나는 그것이 더 간결한 것처럼 느낀다. –

1

사용자가 무언가를 제대로 입력하지 않았을 때 입력을 계속 요청하려면 while 루프를 사용하고 싶습니다. while 루프 while, usr_input은 절대로 변경되지 않으므로 루핑을 계속 유지합니다.

또 다른 문제가 있습니다. usr_input이 1이 아니고 2가 아닌 경우에만 루핑을 계속해야합니다. 1이 아니거나 2가 항상 참입니다 (2 일 경우 1, 1 일 경우 1). 2) 아닙니다.

usr_input = input("Input: ") 
while (usr_input != '1') and (usr_input != '2'): 
    usr_input = input("Input: ") 

if usr_input == '1': 
    search() 
elif usr_input == '2': 
    sys.exit() 
+0

처음 입력을 요청할 때 실제로 아무것도하지 않으므로 while 루프는 아직 값이없는 것을 참조하지 않도록 생략하고'usr_input = 0'으로 대체하면 안됩니까? –

+1

(usr_input! = '1') 또는 (usr_input! = '2')는 항상 true이고, '와'가 있어야합니다. –

+0

먼저 "1"을 입력하면 while 루프를 입력하지 않습니다. Adrian에게 고마워. –

-1

input()eval(raw_input())의 등가를 수행하므로 사용자 입력 뭔가 문법적으로 잘못된 경우, 그것은 구문 에러의 예외가 발생합니다. 문서보기 : http://docs.python.org/library/functions.html#input

SyntaxError를 잡아서 처리하면 코드가 향상 될 수 있으므로 프로그램을 중단시키지 않아도됩니다.

+0

이것은 사실이 아닌 Python 3입니다. –

+0

@DanielRoseman 제 경험이 프리 파이썬 3임을 인정합니다 - 어떤 비트가 사실이 아닌가? 'eval()'의 행동이나 예외를 잡는가? –

+3

3.x'input'의 @KarlBarker는 문자열을 읽고 개행을 제거합니다. 'eval()'이 수행되지 않습니다. – soulcheck

관련 문제