Как 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 словари путь для ввода, не тестируют для каждого случая
Это ожидаемое поведение. '' если выбор ǸOT 1,2,3, то пропустите блок еще выполнить блок! '' –