Python添加其他代码以内联循环?

时间:2016-03-31 15:23:49

标签: python python-2.7

以下是完全伪造的代码。但是,让我们说你需要做一些额外的副作用函数调用(用于调试日志)?你会怎么说呢?

[ i for i in range(10) ]

或者总是必须重写为正常的循环吗?

list=[]
for i in range(10):
   otherStuff()
   list.append(i)

在C中,有一个逗号运算符用于此类事情......

3 个答案:

答案 0 :(得分:6)

显然,不要在列表推导中使用副作用。即使您完全理解它,它也会让下一个必须维护它的人难以理解您的代码。列表推导是创建列表的简洁方式,而不是调用函数n次的方法。

如需进一步阅读,请参阅问题Is it Pythonic to use list comprehensions for just side effects?

换句话说,你应该使用一个明确的for循环。

答案 1 :(得分:3)

您需要在值表达式的某处包含对副作用代码的调用,但您需要忽略该值。

or是一个可能的选择。只需确保副作用函数返回“Falsey”值(False,None,0等),并将调试调用放在or的左侧。

def debug_func(i):
    print i, i**3
    return None
whole_numbers = [ debug_func(i) or i for i in range(10) ]
print whole_numbers

作为替代方案,您的函数可以是一个标识函数,始终返回其唯一参数:

def debug_func(i):
    print i, i**3
    return i

# Production code:
whole_numbers = [i for i in range(10)]

# Debug code
whole_numbers = [debug_func(i) for i in range(10)]

答案 2 :(得分:1)

这是一个不需要函数返回的选项:

[(myfunc(), i)[1] for i in range(10)]

您一次也可以执行多项功能:

[(myfunc(), myfunc2(), i)[-1] for i in range(10)]