В последнее время я привык писать рекурсивные функции внутри функций-оболочек в 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)
Причина, по которой я делаю это, потому что вы, вероятно, не хотите загрязнять пространство имен вспомогательными функциями. Кроме того, вы можете рассматривать вспомогательную функцию как закрытие, если вы хотите получить доступ к переменным из функции обертки.
Но этот стиль написания кода устарел? Я не могу найти нигде в PEP 8, который утверждает, что встраивание функций внутри функций не рекомендуется.
Во вложенной версии вспомогательная функция будет переопределяться каждый раз, когда вызывается внешняя функция. – augurar
@augurar: Это правда. Но если я не писал очень большую рекурсивную функцию, это не должно быть проблемой для переопределения вложенной функции каждый раз. – hlin117