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

标签 python loops

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/

相关文章:

python - random.choice() 有两个参数?

python - 如何制作只有 5 个高分的高分文本文件

python - Python的 "and"关键字在len()函数中是如何解析的?

java - 如何使用一组中的键和另一组中的值填充 HashMap

java - 在 Java 中使用 while 循环不安全吗?

loops - 批处理文件遍历子文件夹并将子文件夹名称用作变量

python - 使用名为 guppy ( heapy ) 的 Python 工具时 C 代码中的段错误

Python 整数和字符串的内存使用情况

javascript - 循环中的随机数生成器语句每次都给我相同的数字。 JavaScript

python - 使用列表中的项目创建文件名 - for 循环