Разве грех использовать бесконечную рекурсию для бесконечных циклов в Python?

Этот вопрос больше связан с любопытством, чем с полезностью. Если я пишу функцию, которая должна запускаться навсегда, например, демон, как бы Python справился с этим, если бы я снова вызвал функцию из конца функции?

def daemonLoop(): # Declare locals # Do stuff daemonLoop() 

Я уверен, что выполнение этого в C приведет к переполнению стека, но с учетом уровня абстракции от C до Python я предполагаю, что материал обрабатывается по-разному.

Пойду ли я в ад для этого?

6 Solutions collect form web for “Разве грех использовать бесконечную рекурсию для бесконечных циклов в Python?”

Почти у всех интерпретаторов Python, которые вызовут переполнение стека, как это было бы в C. Функция более высокого уровня, которая позволила бы это сделать, называется « Оптимизация хвостового звонка» или «Устранение исключения хвоста», а доброжелательный диктатор Python выступает против добавления этого языка .

Этот стиль считается неидиоматичным для Python, а простой, while True: loop является предпочтительным.

Максимальную глубину рекурсии можно получить с помощью sys.getrecursionlimit() и установить с помощью sys.setrecursionlimit() .

Пойду ли я в ад для этого?

Да. CPython не имеет исключения для рекурсии хвоста / оптимизации последнего звонка.

 def recurse(): recurse() recurse() 

Ошибка:

   # 1000 или около того строк этого:
   Файл «", строка 2, в рекурсии
 RuntimeError: превышена максимальная глубина рекурсии

Версия C интерпретатора Python (вероятно, это то, что вы используете) в конечном итоге приведет к ошибке, если вы никогда не вернетесь с daemonLoop . Я не уверен в других версиях.

Я не знаю, почему вы думаете о том, чтобы делать что-то подобное, когда вы могли бы просто иметь бесконечный цикл while. В любом случае, вопрос о том, будет ли он работать:

 ... File "test.py", line 7, in daemonLoop daemonLoop() File "test.py", line 7, in daemonLoop daemonLoop() RuntimeError: maximum recursion depth exceeded 

Так что да, черт возьми.

Наверное, не очень хорошая идея ….

 def forever(): forever() forever() 

RuntimeError: превышена максимальная глубина рекурсии

http://paulbarry.com/articles/2009/09/02/infinite-recursion

 (define forever (lambda () (forever))) 

Такая рекурсия – это то, что делают диалекты Лиспа, такие как Scheme!

  • Python ctypes: wraping c ++ класс с операторами
  • вызов C ++ с использованием функции Eigen Library в python
  • небезопасное использование относительного rpath libboost.dylib при создании boost.python helloword demo?
  • Как использовать C ++-функции OpenCV из Python?
  • Почему синтаксис C ++ настолько сложный?
  • Вызов функции Python из программы C
  • Сбой при вызове из boost :: python :: exec (ничего)
  • Как вызывать внешние скрипты / программы из node.js
  • Python - лучший язык программирования в мире.