Пересмотр функций в Python 3 - PullRequest
0 голосов
/ 21 февраля 2012

В моем сценарии у меня есть четыре функции, которые работают следующим образом:

def function_four():
    # Does Stuff
    function_one()

def function_three():
    # Does Stuff
    function_two()

def function_one(): 
    usr_input = input("Options: '1') function_three | '2') Quit\nOption: ")
    if usr_input == '1':
        function_three()
    elif usr_input == '2':
        sys.exit()
    else:
        print("Did not recognise command. Try again.")
        function_one()

def function_two():
    usr_input = input("Options: '1') function_four | '2') function_three | '3') Quit\nOption: ")
    if usr_input == '1':
        function_four()
    elif usr_input == '2':
        function_three()
    elif usr_input == '3':
        sys.exit()
    else:
        print("Did not recognise command. Try again.")  
function_one()

Мне нужно знать, не вызовет ли это проблему, я думаю, что это произойдет: функции никогда не закрываются, вызывая множество открытых функций (и, по-видимому, потраченная впустую память и возможное замедление), чтобы они никогда не исчезали, пока пользователь не закроет сценарий.Если это правда, то это, скорее всего, будет плохой практикой и нецелесообразным, а это означает, что должна быть альтернатива?

1 Ответ

8 голосов
/ 21 февраля 2012

Всякий раз, когда у вас есть код Python:

Вызывая ту же функцию, чтобы, если пользователь не выбрал одно из других утверждений, он мог бы попробовать снова, а не программу, чтобы перестать работать,

вам почти всегда лучше заменить рекурсивный вызов циклом. В этом случае рекурсия совершенно не нужна, вероятно, тратит ресурсы и, возможно, затрудняет выполнение кода.

edit: Теперь, когда вы разместили код, я бы рекомендовал преобразовать его в конечный автомат . На следующей странице представлена ​​сводка модулей Python, которые могут быть полезны: ссылка .

Даже без каких-либо дополнительных модулей ваш код поддается простой нерекурсивной перезаписи:

import sys

def function_four():
    # Does Stuff
    return function_one

def function_three():
    # Does Stuff
    return function_two

def function_one():
    usr_input = input("Options: '1') function_three | '2') Quit\nOption: ")
    if usr_input == '1':
        return function_three
    elif usr_input == '2':
        return None
    else:
        print("Did not recognise command. Try again.")
        return function_one

def function_two():
    usr_input = input("Options: '1') function_four | '2') function_three | '3') Quit\nOption: ")
    if usr_input == '1':
        return function_four
    elif usr_input == '2':
        return function_three
    elif usr_input == '3':
        return None
    else:
        print("Did not recognise command. Try again.")
        return function_two

state = function_one
while state is not None:
    state = state()

Обратите внимание, что функции больше не вызывают друг друга. Вместо этого каждая из них возвращает следующую функцию для вызова, и цикл верхнего уровня заботится о вызове.

...