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文档中获取的基本定义开始。
列表理解由括号组成,括号中包含一个表达式,后跟一个
The problem is it's everywhere, nearly all the examples I found here and there use it.
号
列表理解是一个非常灵活的概念。它允许我们根据数学知识定义列表。假设我们有一个集合
见上述定义。用一段文字来描述它。但有更好的方法来描述它。
1 | S = {x2 : x in {0 ... 10}} |
这就是我喜欢数学的原因,它总是有意义的。现在还记得你的第一个例子吗?
1 | S = [x**2 for x in range(10)] |
号
这就是我们刚刚定义的场景。整洁,对吗?这就是为什么它被大量使用的原因。(不要与
在Python中,您可以迭代几乎所有内容。这基本上意味着您可以轻松地迭代字符串中的每个字符。让我们来看第二个例子。它只是迭代单词
1 | lst = [j + k for j in 'abc' for k in 'def'] |
注意,我们把它分配给了一个名为
1 | help(lst) |
。
你现在可以看到你可以用
1 | print type(lst) |
在我们继续之前,我们先来谈谈迭代器和生成器。
迭代器是可以对其调用
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) |
。
上面一行所做的是首先使用生成器表达式创建一个生成器,并对每个元素进行迭代,并对这些元素求和。