#python #if-statement #while-loop #menu #structure
#python #if-оператор #цикл while #меню #структура
Вопрос:
Я пишу простую программу, которая выглядит примерно так:
while True:
choice = float(input("options: "))
if choice == 1:
# Do something
elif choice == 2:
# Do something
elif choice == 3: # <--- seems redudant
while choice == 3:
choice_return = input("do you want to return?: ")
if choice_return == "yes":
choice = None
else:
pass
elif choice == 4:
break
Как отмечено в коде, «elif statment» кажется избыточным, поскольку он имеет те же условия, что и «цикл while» ниже. Вы, конечно, можете просто написать код следующим образом:
while True:
choice = float(input("options: "))
if choice == 1:
# Do something
elif choice == 2:
# Do something
elif choice == 4:
break
while choice == 3: <--- three after four, no!!!
choice_return = input("do you want to return?: ")
if choice_return == "yes":
choice = None
else:
pass
в этом примере это выглядит неплохо, но в реальном коде это как бы разрушает структурирование (а мой OCD этого не допускает). Есть ли способ, которым я могу удалить избыточность при сохранении порядка?
ПРИМЕЧАНИЕ. предположим, что «номер выбора» фиксирован.
Комментарии:
1. есть ли только 4 варианта, которые пользователь может ввести?
2. вы можете использовать регистр переключения.
3. В Python нет
switch
.
Ответ №1:
Вы можете придерживаться if/elif
структуры и очистить вещи, обернув логику elif choice == 3
в функцию и используя while True
рецепт в функции:
def myfunc()
while True:
choice_return = input("do you want to return?: ")
if choice_return == "yes":
return None # None here is redundant
while True:
choice = float(input("options: "))
if choice == 1:
...
elif choice == 3:
choice = myfunc()
...
Ответ №2:
Кажется, нет никаких причин использовать choice
в качестве условия в while
цикле. Реструктурируйте его так, чтобы он использовался break
для остановки цикла при необходимости.
elif choice == 3: # <--- seems redudant
while True:
choice_return = input("do you want to return?: ")
if choice_return == "yes":
break
Ответ №3:
Поместите внутренний цикл while в функцию, тогда код будет намного чище. У вас все равно будут оба теста, но целочисленные сравнения выполняются быстро — так почему вы используете float
?
А еще лучше, если бы вы могли преобразовать каждый «случай» в функцию, вы могли бы использовать список функций.
# Functions return True to break out of the loop, otherwise False
def case1():
# Do something
def case2():
# Do something
def case3():
# Do something
def case4():
# Do something
cases = [case1, case2, case3, case4]
while True:
choice = int(input("options: "))
if choice < len(cases) and choice >= 0:
if cases[choice]():
break
else:
print("Invalid option", choice)