Альтернатива рекурсии?

#python #python-3.x #infinite-recursion

#python #python-3.x #бесконечная рекурсия

Вопрос:

Я начинаю изучать Python. Прямо сейчас я создаю CLI, который позволяет создавать, просматривать или удалять контакты, хранящиеся в базе данных SQLite 3. Проблема в том, что каждый раз, когда я завершаю задачу, я снова вызываю функцию main, чтобы пользователь мог делать другие вещи. Код выглядит так:

 def main(self):
    print("What operation would you like to perform: Display contacts (1), add a new one (2), or remove one  (3)?")
    option = int(input())
    try:
        if option == 1:
            self.display()
            self.main()
        elif option == 2:
            self.new()
            self.main()
        elif option == 3:
            self.delete()
            self.main()
    except TypeError:
        print("Please introduce a valid option")
        sys.exit()
 

Я почти уверен, что последовательные вызовы функции снижают ее производительность, и я думаю, что существует ограничение на то, сколько раз вы можете вызывать рекурсивную функцию, так как же мне снова вызвать метод main?

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

1. Используйте цикл для повторения всего содержимого main while option == 1

2. Ваше except предложение никогда не будет выполнено. Вы намеревались, чтобы option = int(input()) строка была внутри try ? Вы знаете, вам действительно не нужно нести расходы на исключения там. Вы можете сказать if option == '1': и пропустить преобразование в целое число.

Ответ №1:

Вы правы насчет рекурсивных вызовов. Они могут быть хорошими, но итерация часто лучше, чем рекурсия.

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

Это довольно некрасиво, но это должно работать без необходимости каждый раз вызывать main() .

 def main(self):
    again=True
    while again:
        print("What operation would you like to perform: Quit(0) Display contacts (1), add a new one (2), or remove one  (3)?")
        option = int(input())
        if option == 0:
            again=False
        if option == 1:
            self.display()
            self.main()
        elif option == 2:
            self.new()
            self.main()
        elif option == 3:
            self.delete()
            self.main()
        else:
            print("Please introduce a valid option")
 

С учетом сказанного вам все равно придется вызывать main()

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

1. continue является ключевым словом и не может использоваться как имя переменной или выражение.

2. continue=True это синтаксическая ошибка, continue это ключевое слово

3. У вас все еще есть continue ключевое слово в вашем коде, в continue=False

Ответ №2:

Вы можете использовать библиотеки аргументов, такие как getopt или argparse

Основная цель здесь — управлять параметрами внутри цикла и вызывать все это сразу. Пример:

$ python3 ./script.py -123

Ответ №3:

В python нет такого понятия, как «основная функция» или «основной метод». Если вы хотите, вы можете прочитать о конструкторах, операциях вызова и т. Д. Итак, если я правильно понял — вы хотите рекурсивно вызвать метод «main».


Вы можете подсчитывать вхождения в этом методе следующим образом: def main(self, count= <your number>): И после этого, если вы хотите назвать это рекурсивным, создайте цикл или просто суммируйте «count»:

 <some code here>
if count == <your number>:
    return
else:
    count  = 5
self.main(count)
 

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

1. Я не голосовал против, но похоже, что OP задает прямо противоположный вопрос, т. Е. Как не использовать рекурсию здесь