Python中的单行循环只能用于构建列表吗?(即列出理解),还是可以用于更一般的计算?
例如,我知道Python中的列表理解(~单行循环),例如
my_list = [ 2*i for i in range(10)]
也可以使用多线回路构建:
my_list = []
for i in range(10):
my_list.append(2*i)
但是,我们能否始终将一般的多行循环转换为一行循环?
例如,假设我们有以下多行For循环:
my_array = np.ones(10*10)
for x in range(10):
my_array[x,:] = 0
我们能把它转换成一个单行循环吗?更一般地说:
Q1.这两种形式在功能上是等价的吗?(即,它们支持相同的操作/操作集)
Q2.我想我以前读过,Python中的单行循环是向量化的。这是真的吗?这是否意味着它们可以比多行循环更快地迭代?
简短的回答是不
列表理解有利于投影(映射)和/或过滤。
例如,如果您有这样的代码:
然后,正如您所指出的,它可以从重写为列表理解中受益:
然而,对于不适合这种投影或过滤模式的操作,列表理解通常不是很好。
例如,如果需要对元素进行变异,但不需要结果,那么列表理解就不合适。以下代码不方便作为列表理解来编写(假设两个方法都返回
None
):有些操作是不允许在理解中进行的。一个例子是,如果满足某个条件,则会提前脱离循环:
我要指出的一点是,这不仅仅是列表,你可以用理解来创建集合,甚至字典。
此外,列表理解通常比多次使用
append
(如您的示例)要快,因为理解是由底层C代码完成的,而不是有额外Python层的append
。当然,理解和其他东西一样有局限性。如果希望对列表/集的每个元素执行一组更大的操作,那么正常循环可能更合适。
相关问题 更多 >
编程相关推荐