Python从Java背景理解列表理解

时间:2015-09-06 16:34:27

标签: python

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

对于以下示例,请允许我了解其工作原理。

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

然后就是这个。

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

除此之外,我还在Stackoverflow上看到了类似这样的内容。

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

还有这样的事情。

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

这开始变得混乱,你能帮帮我吗?

1 个答案:

答案 0 :(得分:6)

  

Python中的列表理解是什么?

首先让我们从官方Python文档中获取基本定义。

列表推导由括号组成,括号中包含一个表达式,后跟一个for子句,然后是零个或多个forif个子句。结果将是一个新列表,该列表是通过在其后面的forif子句的上下文中评估表达式而得到的。

  

问题在于无处不在,几乎我在这里和那里找到的所有例子都使用它。

列表理解是一个非常灵活的概念。它允许我们根据数学知道定义列表。假设我们有一组S,其中S的每个元素都是数字x的正方形而x只能取0到{10之间的值{1}}。

见上述定义。花了一段时间来描述它。但有一种更好的方式来描述它。

S = {x² : x in {0 ... 10}}

这就是为什么我喜欢数学,这总是很重要。现在还记得你的第一个例子吗?

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

这就是我们刚刚定义的集合。干得好吗?这就是它被如此广泛使用的原因。 (不要混淆x**2语法,因为Python遵循一种奇怪的语法,你可能会熟悉其他语言中的x^2。)

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

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

请注意,我们已将此分配给名为lst的列表。这不是巧合。 Python是我所关注的最人性化的编程语言。所以当你遇到困难时她会帮助你。像这样。

help(lst)

您现在可以看到使用lst可以执行的操作了。曾经困惑lst是什么?您可以通过type查看内容。

print type(lst)

在我们继续前进之前,让我们先谈谈迭代器生成器

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

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

现在我们可以打印迭代器的第一个元素,就像这样。

print iterator.next()

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

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

这是一个生成器表达式。生成器表达式就像是用类似于列表推导的表达式构建生成器的快捷方式。

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

以上行的作用是首先使用生成器表达式创建生成器并迭代每个元素并对这些元素求和。