以下是完全伪造的代码。但是,让我们说你需要做一些额外的副作用函数调用(用于调试日志)?你会怎么说呢?
[ i for i in range(10) ]
或者总是必须重写为正常的循环吗?
list=[]
for i in range(10):
otherStuff()
list.append(i)
在C中,有一个逗号运算符用于此类事情......
答案 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)]