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 中的单行循环是矢量化。这是真的?这是否意味着它们可以比多行循环迭代得更快?
最佳答案
But can we we always transform general multi-line loops in Python into one-line loops?
简短的回答是否定的。
列表推导有利于投影(映射)和/或过滤。
例如,如果您有这样的代码:
result = []
for x in seq:
if bar(x):
result.append(foo(x))
然后,正如您所指出的,它可以从重写为列表理解中受益:
result = [foo(x) for f in seq if bar(x)]
然而,对于不符合此投影或过滤模式的操作,列表理解通常不太好。
例如,如果您需要改变元素但不需要结果,那么列表推导式就不合适了。下面的代码不方便写成列表理解(假设两种方法都返回None
):
for x in seq:
x.foo() # Modify x
x.bar() # Modify x again
某些操作在推导式中是不允许的。一个例子是在满足条件时提前跳出循环:
for x in seq:
if x.foo():
break
else:
x.bar()
关于python - Python 中的单行和多行循环和矢量化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13693275/