什么时候在Python中使用嵌套函数是好的?

lig*_*ike 9 python

我不是指闭包,外部函数返回内部函数,或者特别是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来说是非常标准的,但是我很好奇是否对于递归辅助函数是否可行是一致的.

Jon*_*sco 7

有很多很好的理由。就个人而言,我经常使用嵌套函数来保持命名空间干净。它在对象方法中特别有用:

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,要么将它暴露给整个包。


bnl*_*cas 5

我使用嵌套函数从列表中查找匹配项:

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)