#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
whileoption == 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:
Вы можете подсчитывать вхождения в этом методе следующим образом: def main(self, count= <your number>):
И после этого, если вы хотите назвать это рекурсивным, создайте цикл или просто суммируйте «count»:
<some code here>
if count == <your number>:
return
else:
count = 5
self.main(count)
Комментарии:
1. Я не голосовал против, но похоже, что OP задает прямо противоположный вопрос, т. Е. Как не использовать рекурсию здесь