2015-07-29 1 views
0

В последнее время я привык писать рекурсивные функции внутри функций-оболочек в python. Например, моя старая привычка вызова рекурсивных функций из оболочки выглядит следующим образом:Запись рекурсивной функции внутри функции в python: устарела?

def sortedArrayToBST(nums): 
    return _toBST(nums) 

def _toBST(nums): 
    if len(nums) == 0: return None 
    mid = len(nums)/2 
    root = TreeNode(nums[mid]) 
    root.left = _toBST(nums[:mid])   
    root.right = _toBST(nums[mid+1:]) 
    return root 

С другой стороны, моя новая привычка вставлять эту рекурсивную функцию внутри обертки:

def sortedArrayToBST(self, nums): 

    def toBST(nums_): 
     if len(nums_) == 0: return None 
     mid = len(nums_)/2 
     root = TreeNode(nums_[mid]) 
     root.left = toBST(nums_[:mid]) 
     root.right = toBST(nums_[mid+1:]) 
     return root 

    return toBST(nums) 

(Problem source here)

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

Но этот стиль написания кода устарел? Я не могу найти нигде в PEP 8, который утверждает, что встраивание функций внутри функций не рекомендуется.

+0

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

+0

@augurar: Это правда. Но если я не писал очень большую рекурсивную функцию, это не должно быть проблемой для переопределения вложенной функции каждый раз. – hlin117

ответ

1

Я знаю, что не стриктура против вложенных функций в Python. Я не думаю, что ведение имени с подчеркиванием является оправданным. Поскольку это определение вложенной функции, оно не будет конфликтовать с именами за пределами этой локальной области, поэтому просто используйте наиболее естественное имя (как будто вы читаете функцию кому-то и объясняете, как она работает).

С другой стороны, рекурсия лучше избегать в Python из-за отсутствия устранения хвостовой рекурсии. Я бы предложил прочитать это: http://blog.moertel.com/posts/2013-05-11-recursive-to-iterative.html ... и посмотреть, можете ли вы преобразовать свой код в итеративную реализацию.

+0

Спасибо за ссылку, Джим. Вы правы, рекурсия в python довольно медленная. Причина, по которой я практиковал рекурсивный код, - это ради вопросов интервью (быстрее писать рекурсивный код, чем итеративный код). Когда я пишу исходный код, я избегаю рекурсии. – hlin117

+0

Я изменил свой код, чтобы избавиться от ведущих подчеркиваний перед 'toBST'. Спасибо за предложение. – hlin117

 Смежные вопросы

  • Нет связанных вопросов^_^