Разве грех использовать бесконечную рекурсию для бесконечных циклов в 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!

  • Генерация кода на C ++ с помощью Python
  • Деление на ноль: int vs. float
  • Абстрактные классы (с чистыми виртуальными методами) в Китоне
  • Ошибка MoveWindow () в C ++ OpenCV 2.3
  • чтение «потоковых» файлов middlebury с помощью python (массив байтов и numpy)
  • Эффективнее использовать if-return-return или if-else-return?
  • Почему LD_PRELOAD не работает с Python?
  • Каковы возможные ловушки при портировании Psyco на 64-битный?
  • Как я могу прослушивать событие мыши в Python на Mac?
  • CPython - интерпретатор байт-кода?
  • C ++ эквивалент Python difference_update?
  • Python - лучший язык программирования в мире.