For 循环与列表理解有何不同?

How is a For-Loop different from a List Comprehension?

我确实尝试过在线理解和寻找答案,但我找不到 清晰简单 的解释循环不同于列表理解。这是一个例子,我认为 return 同样的事情,但事实并非如此。

给定一组数字,return每个元素的倒数。每正变负,负变正。

a_list = [1, 2, -3, 4, 5]

一个for循环

def invert(a_list):
    for x in a_list:
        return -x

invert(a_list)
-1

而在列表理解中...

def invert(a_list):
    return [-x for x in a_list]

invert(a_list)
[-1, -2, 3, -4, -5]

我很感激任何解释,我仍然对何时使用其中一个或另一个感到困惑。 谢谢!

你的两个函数做的不是同一件事。在第一个示例中,您在遍历循环之前 return,因此只有一个项目被 returned。第二个示例 return 是完整的新列表。

你需要做更多像这样的事情:

a_list = [1, 2, -3, 4, 5]

def invert_one(a_list):
    invert_list = []
    for x in a_list:
        invert_list.append(-x)
    return invert_list

def invert_two(a_list):
    return [-x for x in a_list]

print(invert_one(a_list))
[-1, -2, 3, -4, -5]

print(invert_two(a_list))
[-1, -2, 3, -4, -5]

1/ for循环是一种通用的循环方法,你可以在循环内做任何事情,它可以包含很多行代码。 结石, 印刷, 调用其他函数...

2/ 一个列表理解的目标是生成一个列表对象, 它通常是单行的,用来使书写和阅读变得美观和简短

3/ 在你的例子中,你并没有真正循环,因为你的 return 第一个迭代值:-x 你不允许第二次迭代追加

如果您想要完全相同的行为:

a_list = [1, 2, -3, 4, 5]
inverted = [-x for x in a_list]
print(inverted)

与以下结果相同:

a_list = [1, 2, -3, 4, 5]
inverted = []
for x in a_list:
    inverted.append(-x)
print(inverted)

好处:这里的列表推导写起来更短,因为这个列表是 easy/short 到 write.So 这两种方法在这里都有效,但是把它写成列表推导更 pythonic 并且很好什么时候可以做到。