每当要对序列中的内容进行循环处理时,就应该尝试用列表推导来代替它。
例1:
下面的程序是获取10以内的偶数,一般的实现方式可能如下:
>>> numbers = range(10)
>>> size = len(numbers)
>>> evens = []
>>> i = 0
>>> while i < size:
... if i % 2 == 0:
... evens.append(i)
... i += 1
...
>>> evens
[0, 2, 4, 6, 8]
这对于c语言而言可能速速没有什么影响,但是在python下会是程序的执行速度变慢:
因为:
1、它使解释程序在每次循环中都要确定序系中的哪一个部分被修改:
2、他似的必须通过国一个计数器来跟踪必须处理的元素。
这种情况,推荐使用列表推导方式,代码更简洁、高效,涉及的元素也更少。在更大的程序中,这意味着引入的缺陷更少,代码更容易阅读和理解
>>> [i for i in range(10) if i % 2 == 0]
[0, 2, 4, 6, 8]
>>> i = 0
>>> seq = ["one", "two", "three"]
>>> for element in seq:
... seq[i] = '%d: %s' % (i, seq[i])
... i += 1
...
>>> seq
['0: one', '1: two', '2: three']
可以使用enumerate,这个内建函数为在循环中使用序列时提供了更加便利的获取索引的方式
>>> seq = ["one", "two", "three"]
>>> for i, element in enumerate(seq):
... seq[i] = '%d: %s' % (i, seq[i])
...
>>> seq
['0: one', '1: two', '2: three']
>>> def _treatment(pos, element):
... return '%d: %s' % (pos, element)
...
>>> seq = ["one", "two", "three"]
>>> [_treatment(i, el) for i, el in enumerate(seq)]
['0: one', '1: two', '2: three']
最后,这个版本的代码更容易矢量化,因为它共享了基于序列中单哥项目的小函数。