Невозможно получить возвращаемые значения, если в питоне if-elif-else - PullRequest
0 голосов
/ 22 мая 2018

Я пытаюсь это сделать с большим фрагментом кода, однако, чтобы сократить его и сделать его простым и коротким, вот что я пытаюсь сделать:

  1. Чтобы создать меню на основе TUI (например,Переключить регистр)
  2. Доступ к функциям из него, которые возвращают значение
  3. Эти значения передаются в другие опции меню

Код:

def menu():  
    ch = int(input('Choice:'))  
    a, b = 1, 1
    # li = ['', '']

    if ch is 1:
        a = 11
        # li[0] = a
        menu()
    elif ch is 2:
        b = 22
        print(a+b)
        # print(li[0]+b)
        menu()
    else:
        print('End')

menu()

При выполнении:

Choice:1
Choice:2
23
Choice:3
End

Ожидание:

Choice:1   # Expecting a = 11
Choice:2   # Expecting 11 + 22
33         # Result to be 33
Choice:3
End

Теперь я понимаю, что этопросто изменив локальную копию переменной.Каким образом я могу получить ценность для переноса?

Я предполагаю, что 11 - это значение в return из некоторой написанной функции, а второе условие принимает значение в качестве параметра для дальнейших вычислений.

Я пробовал этот код сСписок, однако не удастся с этим.Вы можете проверить комментарии в коде.

Нет, просто с помощью if - else, я пошел после выполнения функции exec(), но это была просто странная идея.

ЛюбойДругой путь также заметен.

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Когда вы в первый раз вызываете функцию меню, вы устанавливаете a и b на 1. Когда вы делаете выбор, вы снова вызываете функцию меню и, таким образом, сбрасываете a и b на 1.

Выследует либо удалить инициализацию a и b внутри функции, инициализировать их перед вызовом меню и передать их как переменные в меню.В качестве альтернативы, вы можете удалить вызовы меню при каждом выборе и заключить ваши входные данные и операторы if / else в цикл while, который будет прерываться, когда ch равен некоторому значению часового значения.

Если вы хотите сделать это, используярекурсия, сделайте это так:

def menu(a, b):
    ch = int(input('Choice:'))
    if ch is 1:
        a = 11
        menu(a,b)
    elif ch is 2:
        b = 22
        print(a+b)
        menu(a,b)
    elif ch is 0:
        print('End')
    else:
        print('Unknown Choice') 

a, b = 1, 1
menu(a, b)

Если вы хотите сделать это с помощью цикла while, сделайте это так:

def menu():
        ch = -1  
        a, b = 1, 1        
        while ch != 0:
            ch = int(input('Choice:'))
            if ch is 1:
                a = 11
            elif ch is 2:
                b = 22
                print(a+b)
            elif ch is 0:
                print('End')
            else:
                print('Unknown Choice')
menu()

Надеюсь, это помогло!

0 голосов
/ 22 мая 2018

Каждый вызов menu() создает новую отдельную локальную область с переменными в этой области, независимыми от других вызовов menu().Изменения в одном вызове не влияют на локальные значения в других вызовах, даже рекурсивные.Поэтому, когда вы вызываете menu(), новый вызов функции начинается сверху, и строка a, b = 1, 1 выполняется, и создаются новые локальные переменные a и b, обе из которых установлены на 1.

Не используйте рекурсию.Используйте цикл while и break или return для выхода из цикла, когда вы закончите:

def menu():  
    # set the initial values for a and b before starting the loop
    a, b = 1, 1
    while True:
        ch = int(input('Choice:'))  

        if ch == 1:
            a = 11

        elif ch == 2:
            b = 22
            print(a+b)

        else:
            print('End')
            # exit the function, and thus also exit the loop
            return

Демонстрация:

>>> menu()
Choice:1
Choice:2
33
Choice:2
33
Choice:4
End

Рекурсия никогда не бывает хорошей идеейдля меню в любом случае;вызовы функций приводят к тому, что состояние функции current помещается на вершину стека и извлекается позднее, когда возвращается вызов функции.Этот стек имеет ограниченное количество места;слишком много выполняющихся вызовов функций, и вы получите ошибку во время выполнения.И вы будете удивлены, как часто пользователи будут выдвигать меню компьютера до этих пределов.

Конечно, вы можете передавать текущие значения a и b другой функции, передавая их как функциюпараметров, и вы можете вернуть новое состояние обратно вызывающей стороне с помощью return.Но гораздо проще использовать бесконечный цикл, и таким образом вам не нужно думать о необходимости передавать состояние вашей программы каждый раз, когда вы хотите запросить у пользователя следующий ввод.

Примечание : Do не используйте is для проверки на равенство значений, используйте ==.is проверяет идентичность , если оба выражения ссылаются на один и тот же объект, а не только если два объекта имеют одинаковое значение.ch is 1 и ch is 2 only случается для работы в CPython, потому что вы столкнулись с подробностями реализации интерпретатора .

...