2012-02-25 3 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 не является OR, а не b», которое равно всегда истинно, так как даже если оно a, оно все еще не b. Лучше сказать, что это not in ['1', '2'].

Собираем их вместе:

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

Я предпочитаю режим «не в списке». –

+0

Есть ли причина использовать метод 'not in list', в отличие от метода, предложенного @orangeoctopus, или это просто личное предпочтение? –

+0

Это хорошо, потому что вам не нужно вводить usr_input более одного раза и масштабируется до большего количества параметров, таких как '['1', '2', '3', '4']'. Я просто чувствую, что это более красноречиво. –

1

Вы хотите использовать цикл while, чтобы продолжать запрашивать ввод, когда пользователь не вводил что-то должным образом. Внутри цикла while, usr_input никогда не изменяется, поэтому он просто продолжает цикл.

У вас также есть другая проблема: вы должны продолжать цикл, только если usr_input не является 1 И не является 2. не 1 или нет 2 всегда истинно (если оно равно 2, это не 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

В первый раз, когда вы запрашиваете ввод, ничего на самом деле здесь нечего делать, поэтому его следует просто исключить и заменить на 'usr_input = 0', чтобы цикл while не ссылался на то, что еще не имеет значения? –

+1

(usr_input! = '1') или (usr_input! = '2') всегда истинно, должно быть «и» –

+0

, если вы сначала наберете «1», он никогда не войдет в цикл while. Спасибо за ловушку Адриана, исправлено. –

-1

input() выполняет эквивалент eval(raw_input()), поэтому, если пользователь вводит что-то синтаксически неправильно, он будет бросать исключение SyntaxError. См. Документы: http://docs.python.org/library/functions.html#input

Вы можете улучшить свой код, поймав SyntaxError и обработав его, чтобы он не разбил вашу программу.

+0

Это Python 3, где это не так. –

+0

@ DanielRoseman Я признаю, что мой опыт - предварительный Python 3 - какой бит не прав? 'eval()' 'поведение или catching Exceptions? –

+3

@KarlBarker в 3.x 'input' только читает строку и убирает новую строку. Нет 'eval()' сделано. – soulcheck

Смежные вопросы