我不是指闭包,外部函数返回内部函数,或者特别是memoization.有几个实例我想写一个递归函数,也许有memoization,并且在外部函数中初始化字典或其他一些数据结构似乎更简单,然后有一个递归的辅助函数写入和访问dict和外部函数的参数.这就是我的意思 -
def foo(arr, l):
cache = {}
result = []
def recursive_foo_helper(i, j, k):
# some code that depends on arr, l, i, j, k, cache, and result
for (x, y) in arr:
if recursive_foo_helper(x, y, k):
return result
return None
Run Code Online (Sandbox Code Playgroud)
而不是使用一些超长签名分别声明辅助函数,
recursive_foo_helper(arr, l, i, j, k, cache={}, result=[])
Run Code Online (Sandbox Code Playgroud)
我已经读过,这样做对于memoization来说是非常标准的,但是我很好奇是否对于递归辅助函数是否可行是一致的.
有很多很好的理由。就个人而言,我经常使用嵌套函数来保持命名空间干净。它在对象方法中特别有用:
class Foo(object):
def bar(self):
def baz(val):
return val
return [ baz(i) for i in range(1,101) ]
Run Code Online (Sandbox Code Playgroud)
如果我baz在 之外声明bar,我要么需要让它成为 的方法Foo,要么将它暴露给整个包。
我使用嵌套函数从列表中查找匹配项:
def get_exact(data, key, match):
def is_match(item):
if (key in item) and (item[key].lower() == match.lower()):
return item
return False
return [i for i in data if is_match(i)]
Run Code Online (Sandbox Code Playgroud)
项目中没有其他调用需要使用is_match(item),那么为什么要单独声明呢?
但是,我会说,对于我的例子,在get_exact()之外声明is_match()会~0.04 seconds在10,000次迭代中更快地运行.
def is_match(item, key, match):
if (key in item) and (item[key].lower() == match.lower()):
return item
return False
def get_exact(data, key, match):
return [i for i in data if is_match(i, key, match)]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1185 次 |
| 最近记录: |