__init__使用方法v lambda

时间:2018-06-26 18:39:36

标签: python methods lambda initialization list-comprehension

在类中初始化属性时,是否有理由避免使用lambda表达式或列表推导,而倾向于使用方法,反之亦然?

例如: 使用

class Foo():
    def __init__(self, data):
        self.data = data

列表理解

class BarListComp():
    def __init__(self, listOfFoo):
        self.data = [fooInst.data for fooInst in listOfFoo if fooInst.data % 2 == 0]

Lambda

class BarLambda():
    def __init__(self, listOfFoo):
        self.data = list(filter(lambda x: x % 2 == 0, map(lambda y: y.data, listOfFoo)))

方法

class BarMethod():

    def __init__(self, listOfFoo):
        self.data = self.genData(listOfFoo)

    @static_method
    def genData(listOfFoo):
        # this could also just be the earlier list comprehension
        listOut = []
        for elem in listOfFoo:
            if elem.data % 2 == 0:
                listOut.append(elem.data)
        return listOut

(请注意,这些可能不是最好的示例,所需的处理可能会更加复杂)

有首选的方法吗?初始化过程是否达到了适当的复杂度,因此有必要拆分一种新方法?

1 个答案:

答案 0 :(得分:0)

只需在@NPE评论中添加(因为我确实同意他的说法),

  

是否有理由避免使用lambda表达式或列表推导,而倾向于使用方法,反之亦然?

答案是是和否。

我的模棱两可的答案是现实的结果,根据您的具体情况选择

现在,舆论支持者,对于您的上述示例,我认为支持Lambda解决方案几乎是无可争辩的。乍一看,很难真正掌握正在发生的事情。所以我会说选择方法选项或列表理解(这将是我的GOTO解决方案)。