Python中的单行和多行循环和矢量化

Ame*_*ina 4 python loops

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中的单行循环被矢量化了.这是真的?这是否意味着它们可以比多线循环更快地迭代

Mar*_*ers 5

但是,我们能否始终将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)

  • 在单行循环中处理异常也很困难. (3认同)