0

我刚刚遇到以下代码,它工作正常,但对我来说似乎很奇怪,因为它甚至不是一个闭包,我想知道它是否是就性能或最佳实践而言的正确编码方式,或者这一切都应该是替换为包含所有逻辑的常规 for 循环?

mylist = [
   {'one': 20,
    'two': 4},
   {'one': -6,
    'two': 64},
   {'one': 18,
    'two': 1},
   {'one': 16,
    'two': 100},
    # ...
]

def business_function(a_list):

    def compute_function(row):
        """
        suppose some more complex computations + appending extra values
        than this dummy example
        """
        row['total'] = row['one'] + row['two']
        return row

    def filter_function(item):
        """
        suppose some complex logic here
        """
        return item['one'] > 5

    # suppose there is some code here ...

    filtered_list = [compute_function(item) for item in a_list if filter_function(item)]

    # and some more code here ...

    return filtered_list


print business_function(mylist)
4

5 回答 5

3

我认为使用这些本地范围的函数没有问题。

除非外部函数会被大量调用,否则对性能的影响将是最小的;例如,当调用外部函数时,这两个函数的代码已经编译好了。额外发生的所有事情是代码对象常量被加载,附加到一个函数,并且该函数存储在一个局部变量中。

通过将它们保持在本地范围内,您可以非常清楚地表明它们的实用性business_function仅适用于范围。

于 2012-08-19T20:00:18.430 回答
2

我要说不,只是因为有更好的方法可以满足这种方法的要求。

  • 如果要防止命名空间冲突,请将函数放在单独的模块中。
  • 如果要与单个功能关联,请将它们全部放在单独的模块中。
  • 如果要减慢执行速度,请改用睡眠功能。

否则,只需使它们正常运行。

于 2012-08-19T20:02:19.760 回答
2

这样做有一个小缺点,因为每次调用封闭函数时都会创建内部函数对象,这是一个小的性能损失。但是,这很少会成为问题,并且改进的代码封装可能使其值得。

另一种方法是创建一个类,但这不会减少开销。

于 2012-08-19T20:02:42.767 回答
2

我不喜欢这种嵌套定义的使用。作者这样做可能是为了提高可读性或防止其他人使用他的私人功能。

如果作者想将这些函数“标记”为私有,他应该在它们的名称前加上下划线。通过这种方式,他也可以在代码的其他部分中重用这些函数,而无需复制它们。

如果他这样做是为了提高可读性……那么,为什么不把它们放在那个函数之外呢?如果他们做了一些真正的计算和过滤,那么他们应该是拥有自己的文档和评论的“顶级”函数。

可能闭包应该只用于装饰器,或者其他一些非常罕见的情况。

于 2012-08-19T21:14:29.170 回答
0

如果函数不使用外部函数的局部变量并且它们不是微不足道的单行代码,那么我会将它们放在全局范围内。

否则,您的代码阅读者将被迫阅读所有函数定义(如果它们是闭包并使用/更改外部局部变量)以了解外部函数的作用。

如果它们是在外部定义的,那么名称和可能的相应文档字符串可能足以理解它们在外部函数中的作用。

于 2012-08-19T21:10:51.563 回答