Python从Java背景理解列表理解

Python understanding list comprehension from Java background

本问题已经有最佳答案,请猛点这里访问。

我来自Java背景,刚刚开始在Python上工作。大多数事情都很容易理解,但是我很难理解语言中的一件事,这就是我刚刚发现的列表理解。在python中,这个列表的理解是什么?这与Java中发现的语言结构相比如何?问题是它无处不在,几乎所有我在这里和那里找到的例子都使用它。

对于下面的示例,请允许我了解这是如何工作的。

1
[x**2 for x in range(10)]

然后就是这个。

1
[j + k for j in 'abc' for k in 'def']

除此之外,我也在StackOverflow的某个地方看到过类似的事情。

1
(x for x in (0,1,2,3,4))

还有像这样的事情。

1
total = sum(x+y for x in (0,1,2,3) for y in (0,1,2,3) if x < y)

这开始变得乱七八糟,你能帮我一下吗?


What is this list comprehension in Python?

首先,让我们从官方python文档中获取的基本定义开始。

列表理解由括号组成,括号中包含一个表达式,后跟一个for子句,然后是零个或多个forif子句。结果将是在后面的forif子句中对表达式进行评估后得到的新列表。

The problem is it's everywhere, nearly all the examples I found here and there use it.

列表理解是一个非常灵活的概念。它允许我们根据数学知识定义列表。假设我们有一个集合S,其中S的每一个元素都是一个数的平方,x只能取010之间的值。

见上述定义。用一段文字来描述它。但有更好的方法来描述它。

1
S = {x2 : x in {0 ... 10}}

这就是我喜欢数学的原因,它总是有意义的。现在还记得你的第一个例子吗?

1
S = [x**2 for x in range(10)]

这就是我们刚刚定义的场景。整洁,对吗?这就是为什么它被大量使用的原因。(不要与x**2语法混淆,因为这里的python使用了一种奇怪的语法,您可能会熟悉其他语言中的x^2)。

在Python中,您可以迭代几乎所有内容。这基本上意味着您可以轻松地迭代字符串中的每个字符。让我们来看第二个例子。它只是迭代单词‘abc’‘def’,并从中创建一个列表。

1
lst = [j + k for j in 'abc' for k in 'def']

注意,我们把它分配给了一个名为lst的列表。这不是巧合。Python是我所关注过的最人道的编程语言。所以当你被困的时候她会帮助你。这样地。

1
help(lst)

你现在可以看到你可以用lst做什么了。你有没有搞不清楚lst是什么?您可以通过type查看它是什么。

1
print type(lst)

在我们继续之前,我们先来谈谈迭代器和生成器。

迭代器是可以对其调用next()方法的对象。这样地。

1
iterator = iter([1,2,3,4])

现在我们可以打印迭代器的第一个元素,如下所示。

1
print iterator.next()

现在我们可以谈谈发电机了。它们是生成迭代器的函数。然而,还有一个称为生成器表达式的概念。

1
(x for x in (0,1,2,3,4))

这是生成器表达式。生成器表达式就像是用类似于列表理解的表达式构建生成器的快捷方式。

1
total = sum(x+y for x in (0,1,2,3) for y in (0,1,2,3) if x < y)

上面一行所做的是首先使用生成器表达式创建一个生成器,并对每个元素进行迭代,并对这些元素求和。