Есть ли способ преобразовать elif и while statment в один?

#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)