根据选择列出理解

Kar*_*tik 2 python list-comprehension

基本上,如果我要编写一个带有可变返回元素的函数,如下所示:

def func(elem1=True, elem2=True, elem3=True, elem4=False):
    x = MyClass()
    ret = []
    if elem1:
        ret.extend([x.func1()])
    if elem2:
        ret.extend([x.obj1])
    if elem3:
        ret.extend([x.func2().attr1])
    if elem4:
        ret.extend(x.list_obj3)
    return ret
Run Code Online (Sandbox Code Playgroud)

事情变得漫长而多风.是否有可能做这样的事情:

def func(elem1=True, elem2=True, elem3=True, elem4=False):
    x = MyClass()
    return [x.func1() if elem1,
            x.obj1 if elem2,
            x.func2().attr1 if elem3,
            x.list_obj3 if elem4]
Run Code Online (Sandbox Code Playgroud)

这有多整洁!?

我知道这可以做到:

def func(elem1=True, elem2=True, elem3=True, elem4=False):
    x = MyClass()
    ret = [x.func1(), x.obj1, x.func2().attr1, x.list_obj3]
    choices = [elem1, elem2, elem3, elem4]
    return [r for i, r in enumerate(ret) if choices[i]]
Run Code Online (Sandbox Code Playgroud)

但是如果用户不想要它们我想不计算它们; 计算其中一些是有点贵.

Nea*_*tan 5

如果你在lambdas中隐藏你的操作,那么你可以使用延迟评估:

def func(elem1=True, elem2=True, elem3=True, elem4=False):
    x = MyClass()
    return [L() for inc,L in (
            (elem1, lambda: x.func1()),
            (elem2, lambda: x.obj1),
            (elem3, lambda: x.func2().attr1),
            (elem4, lambda: x.list_obj3),
            ) if inc]
Run Code Online (Sandbox Code Playgroud)