2 python
我来自Java背景,刚开始使用Python.大多数事情都很容易上手,但我很难理解我刚刚发现的一种叫做列表理解的语言.这是什么在Python列表理解?这与Java中的语言结构相比如何?问题是它无处不在,几乎我在这里和那里找到的所有例子都使用它.
对于以下示例,请允许我了解其工作原理.
[x**2 for x in range(10)]
Run Code Online (Sandbox Code Playgroud)
然后就是这个.
[j + k for j in 'abc' for k in 'def']
Run Code Online (Sandbox Code Playgroud)
除此之外,我还在Stackoverflow上看到过这样的事情.
(x for x in (0,1,2,3,4))
Run Code Online (Sandbox Code Playgroud)
还有这样的事情.
total = sum(x+y for x in (0,1,2,3) for y in (0,1,2,3) if x < y)
Run Code Online (Sandbox Code Playgroud)
这开始变得混乱,你能帮我吗?
Python中的列表理解是什么?
首先让我们从官方Python文档中获取基本定义.
列表推导由括号组成,括号包含一个表达式后跟一个for子句,然后是零个或多个for或if子句.结果将是一个新的列表,该列表是通过在其后面的for和if子句的上下文中评估表达式而得到的.
问题是它无处不在,几乎我在这里和那里找到的所有例子都使用它.
列表理解是一个非常灵活的概念.它允许我们根据数学知道定义列表.假设我们有一组S中的每一个元素S是一个数字的平方x和x只能取范围从0到10.
见上面的定义.花了一段时间来描述它.但有一种更好的方式来描述它.
S = {x² : x in {0 ... 10}}
Run Code Online (Sandbox Code Playgroud)
这就是为什么我喜欢数学,这总是很重要.现在记住你的第一个例子?
S = [x**2 for x in range(10)]
Run Code Online (Sandbox Code Playgroud)
这就是我们刚刚定义的集合.干得好吗?这就是它被如此广泛使用的原因.(不要混淆x**2语法,因为Python遵循一种奇怪的语法,你可能会熟悉x^2其他语言.)
在Python中,您可以迭代几乎任何东西.这基本上意味着您可以轻松地遍历字符串的每个字符.我们来看第二个例子.它只是迭代单词‘abc’并‘def’创建一个列表.
lst = [j + k for j in 'abc' for k in 'def']
Run Code Online (Sandbox Code Playgroud)
请注意,我们将此分配给名为的列表lst.这不是巧合.Python是我所关注的最人性化的编程语言.所以当你遇到困难时她会帮助你.像这样.
help(lst)
Run Code Online (Sandbox Code Playgroud)
您现在可以看到您可以做些什么lst.曾经困惑的是什么lst?你可以检查它是什么type.
print type(lst)
Run Code Online (Sandbox Code Playgroud)
在我们继续前进之前,让我们先谈谈迭代器和生成器.
迭代器是可以调用next()方法的对象.像这样.
iterator = iter([1,2,3,4])
Run Code Online (Sandbox Code Playgroud)
现在我们可以打印迭代器的第一个元素,就像这样.
print iterator.next()
Run Code Online (Sandbox Code Playgroud)
现在我们可以谈谈发电机.它们是生成迭代器的函数.然而,还有一个叫做生成器表达式的概念.
(x for x in (0,1,2,3,4))
Run Code Online (Sandbox Code Playgroud)
这是一个生成器表达式.生成器表达式就像是用类似于列表推导的表达式构建生成器的快捷方式.
total = sum(x+y for x in (0,1,2,3) for y in (0,1,2,3) if x < y)
Run Code Online (Sandbox Code Playgroud)
以上行的作用是首先使用生成器表达式创建生成器并迭代每个元素并对这些元素求和.