Python中的单行循环只能用于构建列表吗?(即列表推导),还是可以用于更一般的计算?
例如,我知道Python中的列表推导(〜单行循环),例如
my_list = [ 2*i for i in range(10)]
Run Code Online (Sandbox Code Playgroud)
也可以使用多行循环构建:
my_list = []
for i in range(10):
my_list.append(2*i)
Run Code Online (Sandbox Code Playgroud)
但是我们总能将一般的多线循环转换成单线循环吗?
例如,假设我们有以下多行for循环:
my_array = np.ones(10*10)
for x in range(10):
my_array[x,:] = 0
Run Code Online (Sandbox Code Playgroud)
我们可以将其转换为单线循环吗?更普遍:
Q1.这两种形式在功能上是否相同?(即他们支持同一组操作/操作)
Q2.我想我之前已经读过Python中的单行循环被矢量化了.这是真的?这是否意味着它们可以比多线循环更快地迭代?
但是,我们能否始终将Python中的一般多行循环转换为单行循环?
最简洁的答案是不.
列表推导适用于投影(映射)和/或过滤.
例如,如果你有这样的代码:
result = []
for x in seq:
if bar(x):
result.append(foo(x))
Run Code Online (Sandbox Code Playgroud)
然后,正如您所指出的,它可以从重写为列表理解中受益:
result = [foo(x) for f in seq if bar(x)]
Run Code Online (Sandbox Code Playgroud)
但是,对于不适合此投影或过滤模式的操作,列表推导通常不太好.
例如,如果您需要改变元素但不需要结果,那么列表推导将不合适.以下代码将不方便写为列表推导(假设两个方法都返回None):
for x in seq:
x.foo() # Modify x
x.bar() # Modify x again
Run Code Online (Sandbox Code Playgroud)
理解中不允许进行某些操作.例如,如果满足条件,则提前退出循环:
for x in seq:
if x.foo():
break
else:
x.bar()
Run Code Online (Sandbox Code Playgroud)