2014-12-15 5 views
-1
weatherType = raw_input('Enter a weather type: ') 

while (weatherType != "WINDDIRECTION") or (weatherType != "WINDSPEED") or (weatherType != "AIRTEMPERATURE") or (weatherType != "WAVEHEIGHT") or (weatherType != "AIRPRESSURE"): 
    print "Sorry, invalid input. Please enter AIRTEMPERATURE, AIRPRESSURE, WAVEHEIGHT, WINDSPEED, or WINDDIRECTION for a city and either WINDDIRECTION, WINDSPEED, or AIRTEMPERATURE for an off shore bouy" 
    weatherType = raw_input('Enter a weather type: ') 

Хорошо так с этим циклом, я пытаюсь получить пользователь ввести либо WINDDIRECTION, WINDSPEED, AIRTEMPERATURE, WAVEHEIGHT или AIRPRESSURE. Однако, даже если пользователь вводит в 1 из этих 5 вариантов, мой код по-прежнему будет вводить цикл while. Я не знаю, что происходит. Я знаю, что я могу использовать цикл for (для x в ["WINDDIRECTION", ....]) однако цикл for будет работать только для того, чтобы увидеть, правильно ли их вход в первый раз, и если они снова вводят неправильный ответ код будет продолжатьХотя цикл с несколькими условиями в питоне

+0

Добро пожаловать на переполнение стека! Есть люди, которые пытались ответить на ваш вопрос. Если бы это помогло вам, вы можете рассказать об этом сообществу, приняв ответ [http://meta.stackoverflow.com/a/5235], который был наиболее полезен для вас. – falsetru

ответ

6
(x != y) or (x != z) ... 

будет всегда быть правдой. Так как вы в Python, я бы рекомендовал использовать вместо in:

if x in ['a', 'b', 'c']: 
+0

Обратите внимание, что в новых версиях Python (а именно, 3.3 и выше) вы должны использовать набор значений: 'if x in {'a', 'b', 'c'}:'. Набор литералов признается интерпретатором константами, поэтому они более эффективны. Конечно, это ничего не значит для OP, так как он использует Python 2.x. – iCodez

+0

Но что, если они снова вводят неправильный ответ? Я не уверен, как сбросить цикл for –

+0

'while x not in ...' Вы также можете начать с установки 'x' на' None', чтобы тест сначала потерпел неудачу, и вам не нужны два оператора ввода. –

0

В дополнение к Ли Даниэль Крокер.

проверить пакет ткани. Есть хорошие инструменты для управления консольным вводом.

from fabric.contrib import console 

def validate(v): 
    answers = ['WINDDIRECTION',...] 
    if v in answers: 
     return int(v) 

question = 'Enter a weather type: ' 

console_prompt = console.prompt(question, default="WINDDIRECTION", validate=validate) 
0

Ваш код продолжает входить в цикл, как вы ожидали вар «weatherType», чтобы получить один из ваших предопределенных значений («», направления ветра и т.д.). Тем не менее, неважно, какой вклад вводит пользователь, условие WHILE всегда будет удовлетворено (потому что «weatherType» будет иметь только одно значение за раз, и оно будет соответствовать условию «или», следовательно, входящему в цикл).

Кроме того, вы можете создать список со всеми вашими параметрами ['WINDDIRECTION', '' и т. Д.] И проверить, введен ли пользовательский список в вашем списке.

Пример:

options = ["WINDDIRECTION", "WINDSPEED", "AIRTEMPERATURE", "WAVEHEIGHT", "WAVEHEIGHT"] 

message = '''Sorry, invalid input. Please enter: 
AIRTEMPERATURE, AIRPRESSURE, 
WAVEHEIGHT, WINDSPEED, or WINDDIRECTION for a city and either 
WINDDIRECTION, WINDSPEED, or AIRTEMPERATURE for an off shore bouy 
''' 

weatherType = raw_input('Enter a weather type: ') 

while weatherType not in options: 
    print message 
    weatherType = raw_input('Enter a weather type: ') 
Смежные вопросы