为什么python列表理解有时不受欢迎?

时间:2011-11-09 16:36:01

标签: python list-comprehension

我见过的很多开发人员建议最好使用简单的循环,如果是条件而不是一行列表理解语句。

我总是发现它们非常强大,因为我可以将大量代码放在一行中,并且它可以节省很多变量。为什么它仍然被认为是一种不好的做法?

(它慢吗?)

3 个答案:

答案 0 :(得分:22)

列表推导用于创建列表,例如:

squares = [item ** 2 for item in some_list]

对于使用列表(或其他对象)的元素做某事,for循环更好:

for item in some_list:
    print(item)

通常不赞成使用对其副作用的理解,或者使用for循环来创建列表。


这里的一些其他答案主张将理解变为循环,一旦变得太长。我不认为这是好风格:创建列表所需的append调用仍然很难看。相反,重构为函数:

def polynomial(x):
    return x ** 4 + 7 * x ** 3 - 2 * x ** 2 + 3 * x - 4
result = [polynomial(x) for x in some_list]

只有当你担心速度时 - 你才能完成你的分析! - 你应该保持长期不可读的列表理解。

答案 1 :(得分:6)

这不算坏。

但是,列表理解要么

  1. 有副作用,或
  2. 作为多行for循环更具可读性
  3. 通常不赞成。

    换句话说,可读性很重要。

    作为第一个不好的例子的过度设计的例子:

    x = range(10)
    [x.append(5) for _ in xrange(5)]
    

    基本上,如果你没有存储结果,和/或它修改了其他一些对象,那么列表理解可能是一个坏主意。

    作为第二个例子,看看几乎所有用python编写的代码高尔夫球条目。一旦您的列表理解开始成为一目了然的可读性,请考虑使用for循环。

答案 2 :(得分:4)

没有性能损失(即使有,我也不担心;如果性能如此重要,你的语言是错误的)。有些人对列表的理解不屑一顾,因为对某些人来说,这有点过于简洁,这是个人偏好的问题。通常,我发现简单的列表推导比它们的循环/条件等价物更易读,但是当它们开始变长(例如,你开始超过80个字符)时,它们可能更好地被循环替换。