在 python 中的函数内编写递归函数:已弃用?
Writing a recursive function within function in python: deprecated?
最近,我养成了在 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 中找不到任何地方声明不鼓励在函数中嵌入函数。
我知道 Python 中没有针对嵌套函数的限制。我不认为用下划线引导名称是必要的。因为是嵌套函数定义,它不会与局部范围外的名称冲突,所以只需使用最自然流畅的名称(就好像您正在向某人阅读该函数并解释其工作原理)。
另一方面,由于缺少尾递归消除,最好在 Python 中避免递归。我建议阅读以下内容:http://blog.moertel.com/posts/2013-05-11-recursive-to-iterative.html ...看看您是否可以将代码转换为迭代实现。
最近,我养成了在 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 中找不到任何地方声明不鼓励在函数中嵌入函数。
我知道 Python 中没有针对嵌套函数的限制。我不认为用下划线引导名称是必要的。因为是嵌套函数定义,它不会与局部范围外的名称冲突,所以只需使用最自然流畅的名称(就好像您正在向某人阅读该函数并解释其工作原理)。
另一方面,由于缺少尾递归消除,最好在 Python 中避免递归。我建议阅读以下内容:http://blog.moertel.com/posts/2013-05-11-recursive-to-iterative.html ...看看您是否可以将代码转换为迭代实现。