ЕСЛИ цикл не работает правильно после выполнения выбора один раз

#loops #if-statement

Вопрос:

Я пытаюсь запустить интерактивный сеанс, в котором пользователь может выбрать из выбора, что делать. После того, как пользователь выберет нужный модуль, выбранный модуль запустится и вернется на страницу выбора. Однако, если пользователь снова выберет тот же модуль, цикл IF пойдет не так. Кто-нибудь знает, что пошло не так с моим кодом? Пожалуйста, обратитесь к приведенному ниже коду для получения более подробной информации.

 def comparison_select():
    global month1, month2
    while True:
        try:
            comparison_menu()
            compare_input = int(input("Enter selected comparison: "))
            if compare_input == 1:
                print("Selected comparison period is: Daily")
                from compare_exp_daily import command_daily
            elif compare_input == 2:
                print("Selected comparison period is: Monthly")
                from compare_exp_monthly import command_monthly
            elif compare_input == 0:
                print("Thank you amp; Goodbye!")
                break
            else:
                print("Error, please enter a number from the menu.n"
                      "Thank you!")
        except:
            print("Error, please enter a valid selection.")
 

Первый вывод работает нормально, но впоследствии, когда пользователь выбирает тот же самый выбор, он идет не так.

выход:

     Comparison Available:         
1. Daily
2. Monthly
0. Exit


Enter selected comparison: 1
Selected comparison period is: Daily

Enter Date (DD/MM/YYYY): 12/07/2021

Enter Date (DD/MM/YYYY): 16/07/2021
-------------------------------------------------------------------------------
Expense for 2021-07-12 is 15.0 dollars.
Expense for 2021-07-16 is 21.0 dollars.
-------------------------------------------------------------------------------
You have spent 6.0 dollars more on 2021-07-16 than on 2021-07-12

Comparison Available:         
1. Daily
2. Monthly
0. Exit


Enter selected comparison: 1
Selected comparison period is: Daily

Comparison Available:         
1. Daily
2. Monthly
0. Exit


Enter selected comparison: 1
Selected comparison period is: Daily

Comparison Available:         
1. Daily
2. Monthly
0. Exit


Enter selected comparison: 0
Thank you amp; Goodbye!
 

Ответ №1:

Для того, что я вижу в вашем коде, единственное объяснение, которое я вижу, заключается в том, что вы всегда импортируете функцию вместо того, чтобы импортировать ее раньше(где это должно быть сделано), а затем всегда запускаете ее в операторе if. Поскольку импорт выполняется только один раз, он запускает его только один раз(что странно, что он даже работает с момента импорта).

Я бы изменил импорт на перед функцией(поскольку они являются глобальными) и вызвал функции в операторе if как таковые:

 #imports
from compare_exp_daily import command_daily
from compare_exp_monthly import command_monthly



def comparison_select():
   global month1, month2
   while True:
       try:
           comparison_menu()
           compare_input = int(input("Enter selected comparison: "))
           if compare_input == 1:
               print("Selected comparison period is: Daily")
               command_daily()
           elif compare_input == 2:
               print("Selected comparison period is: Monthly")
               command_monthly
           elif compare_input == 0:
               print("Thank you amp; Goodbye!")
               break
           else:
               print("Error, please enter a number from the menu.n"
                     "Thank you!")
       except:
           print("Error, please enter a valid selection.") 
 

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

 #imports
from compare_exp_daily import command_daily
from compare_exp_monthly import command_monthly



def comparison_select():
    global month1, month2
    while True:
        comparison_menu()
        compare_input = int(input("Enter selected comparison: "))
        if compare_input == 1:
            print("Selected comparison period is: Daily")
            command_daily()
        elif compare_input == 2:
            print("Selected comparison period is: Monthly")
            command_monthly
        elif compare_input == 0:
            print("Thank you amp; Goodbye!")
            break
        elif compare_input !=0 amp;amp; compare_input!= 1 amp;amp; compare_input!=2:
            print("Error, please enter a number from the menu.n Thank you!")
         
 

И еще кое-что. Хотя, хотя True работает, я бы использовал выход while !=1, потому что он более эффективен для памяти и не всегда является лучшим способом выполнения задач. Вы должны обновить эту переменную выхода до 1 в условии if compare_input == 0, например:

 elif compare_input == 0:
            print("Thank you amp; Goodbye!")
            exit = 1

 

Если вы хотите перейти к этому решению, пожалуйста, убедитесь, что переменная exit находится вне цикла while, и поместите ее с любым другим значением, отличным от 1.

Любые вопросы о моем ответе, пожалуйста, задавайте, я здесь, чтобы помочь 🙂

Комментарии:

1. Большое вам за это спасибо! Мне удалось решить свою проблему с помощью вашего решения.

2. Не за что ! Рад, что смог помочь