2013-10-27 4 views
-1

Я пытаюсь написать программу Python, где он просит пользователя сделать выбор с использованием 1, 2 или 3. Если пользователь не вводит их, он предлагает пользователю ввести только эти числа.Ввод пользователя и цикл while

После того, как пользователь входит в 1, 2 или 3, программа затем просит его СНОВА ввести 1, 2 или 3. Это повторяется 10 раз, и если пользователь не вводит ни 1, 2, ни 3, он запрашивает пользователь вводит только те цифры. Это то, что у меня есть до сих пор;

while(choice>3 or choice<1): 
    choice = int(input("Please enter a value from 1 - 3 only:")) 
    while (((choice == 1 or choice == 2 or choice == 3) and (count < 10))): 
      run program 

Проблема в том, что если пользователь изначально входит в 1, 2 или 3, программа не запускается. Но если пользователь впервые вводит что-то, кроме 1, 2 или 3, программа ведет себя так, как я этого хочу.

+0

Это ожидаемое поведение. '' если выбор ǸOT 1,2,3, то пропустите блок еще выполнить блок! '' –

ответ

1

Он не запускается, когда вводятся 1,2,3, потому что цикл while исключает эти числа.

Код:

while(choice>3 or choice<1): 

1,2, and 3 пропустит этот блочно поэтому код внутри блока не будет работать, и программа не будет делать ничего.

+0

Да, я понимаю, что я знаю, что могу сделать еще один цикл поверх моего первого цикла while (((выбор == 1 или выбор == 2 или выбор == 3) и (count <10))) и заставить программу делать то, что я хочу, но я не хочу повторять весь мой код только из-за этого – Freud

0

Как Blue Ice упоминалось выше проблемы заключается в этой строке:

while(choice>3 or choice<1): 

Проблема в том, что вы только работает это время цикла, если выбор больше 3 или меньше 1, но внутри этого цикла вы тестируют для этого условия:

while (((choice == 1 or choice == 2 or choice == 3) and (count < 10))): 

Этот код всегда недостижим для еще потому первый в то время как петля для его запуска требуется, кроме 1, 2 номера, или 3, чтобы войти в петлю. Это означает, что этот цикл while никогда не может работать, потому что первое условие, которое вы тестируете, является гарантированным, чтобы быть ложным, и, таким образом, вы и сравнение никогда не сможете оценить истину becasue True and False is False вне зависимости от того, что

Лично я бы не создал свое приглашение ввода в как вы это делали, потому что это не так просто поддерживать, как другие варианты. В python можно создавать меню с использованием словарей, которые я предпочитаю. Что вы делаете, так это сохранение ключа как выбора и значения в качестве ссылки на функцию, которую вы хотите выполнить. Я предпочитаю это, потому что это исключает необходимость настройки всех логических тестов в вашем цикле, и это облегчает добавление или удаление параметров.

Код для создания меню, как вы просите, будет выглядеть примерно так.

options = {  1 : option_1, 
       2 : option_2, 
       3 : option_3 
} 

user_input = int(raw_input("1, 2, or 3")) 

#The() are required because otherwise you will get the memory address of the function and the funciton itself won't run 
options[user_input]() 

что означает, конечно, что вы должны разместить свой код в функции (делать то, что синтаксис выглядит следующим образом)

def function(): 
    do stuff 

Обратите внимание, как в словаре функция сохраняется без(). Это делается потому, что без скобки это ссылка на саму функцию (если вы выполняете печать, вы увидите, что она дает вам адрес памяти), в скобках будет выполняться функция.Затем вы просто вызываете функцию, добавляя скобки к дикторальному поиску, как это options[user_input]()

Извините, что я не совсем понимаю, что вы делаете, с подсказкой после 10 раз, потому что вы должны побуждать их исправить их вход каждый раз, когда они запутались, но я считаю, чтобы использовать этот метод, чтобы сделать то, что вы хотите сделать, будет выглядеть примерно так:

#Count to see how many times they mess up 
count = 0 
#Options dictionary 
options = {  1 : option_1, 
       2 : option_2, 
       3 : option_3 
} 

#I am using Python 3 BTW 
print("Enter 1, 2 or 3 ") 
#And I am assuming they will give good input 
user_input = int(raw_input("1, 2, or 3")) 
#This more closly mimics what you are doing but like I said I would avoid this so you don't have to hard code how many options you have 
#while((user_input is not 1) or (user_input is not 2) or (user_input is not 3)) 
#try this 
#It makes sure you are not out of bounds for an any number of elements 
while(user_input < 0 and user_input > len(options)): 
    #if you are ask for new input 
    user_input = int(raw_input("1, 2, or 3")) 
    #increment count 
    count += 1 
    #check if they messed up 10 times 
    if(count == 10): 
     print("Enter 1, 2, or 3") 
     #reset count so it will tell them on the next 10th time 
     count = 0 

#to break the while loop above you must have valid input so call the function 
options[user_input]() 

#And of course you need to define you functions to do the different options 
def option_1(): 
    do option_1 stuff 

def option_2(): 
    do option_2 stuff 

def option_3(): 
    do option_3 stuff 

Снова в то время как это очень отличается от того, что у вас есть, но это намного проще, чтобы добавить новые параметры таким образом, потому что вам нужно только добавить новую функцию и добавить опцию в словарь, и вам не нужно беспокоиться о тестировании для каждого выбранного вами варианта.

TL; DR: Python словари путь для ввода, не тестируют для каждого случая

1

с кодировкой, аналогично, как можно то, что вы имели:

try_count = 0 
choice = "" 
valid = False 

while True: 
    print("Please enter a number between 1 and 3") 
    while True: 
     try_count += 1 

     choice = input("") 

     try: #make sure the user has entered a number 
      choice = int(choice) 
      if choice >= 1 or choice <= 3: #if the value is outside our range 
       valid = True 
       break #then we're done! 
     except: 
      continue #if the user didn't enter a number, go around again 

     if try_count >= 10: #if we've done this ten times exit 
      try_count = 0 
      break #exit to the outer loop 

     if valid: #if we've got a proper value, we're done 
      break #exit the loop 
0

Или вы можете использовать этот пример кода:

choices_menu = ''' 
Please select input menu : 
Enter 1> Show latest 100 data 
Enter 2> Show latest 1000 data 
Enter 3> Show all data''' 

choice = 0 
while(choice>3 or choice<1): 
    print choices_menu 
    choice = raw_input("Your choice (Input number 1 to 3) ? ") 
    try: 
     choice = int(choice) 
     if choice >= 1 and choice <= 3: 
      break 
    except: 
     continue 

print choice 

Результат:

Please select input menu : 
Enter 1> Show latest 100 data 
Enter 2> Show latest 1000 data 
Enter 3> Show all data 
Your choice (Input number 1 to 3) ? -1 

Please select input menu : 
Enter 1> Show latest 100 data 
Enter 2> Show latest 1000 data 
Enter 3> Show all data 
Your choice (Input number 1 to 3) ? 0 

Please select input menu : 
Enter 1> Show latest 100 data 
Enter 2> Show latest 1000 data 
Enter 3> Show all data 
Your choice (Input number 1 to 3) ? 5 

Please select input menu : 
Enter 1> Show latest 100 data 
Enter 2> Show latest 1000 data 
Enter 3> Show all data 
Your choice (Input number 1 to 3) ? 4 

Please select input menu : 
Enter 1> Show latest 100 data 
Enter 2> Show latest 1000 data 
Enter 3> Show all data 
Your choice (Input number 1 to 3) ? 3 
3 

Process finished with exit code 0 
Смежные вопросы