列表解析与生成器表达式

最近在学习python的过程中,对列表解析及生成器表达式有点疑惑。从表面上看,两者很相似,只有一点不同:列表解析采用中括号[]来包含,生成器表达式采用小括号()来包含。

两者都可以用来动态的创建列表,但是本质上又有些不同。

先来看下列表解析:

列表解析可以用来修改一个列表,或者是动态的创建一个列表。它的表达式为:

[expr for iter_var in iterable]    or    [expr for iter_var in iterable if cond_expr] 

第一种语法:首先迭代iterable里所有内容,每一次迭代,都把iterable里相应内容放到iter_var中,再在表达式中应用该iter_var的内容,最后用表达式的计算值生成一个列表。
第二种语法:加入了判断语句,只有满足条件的内容才把iterable里相应内容放到iter_var中,再在表达式中应用该iter_var的内容,最后用表达式的计算值生成一个列表。

>>> [i for i in range(10)]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
注意,列表解析会产生一个新的列表,如上所示。

>>> [i for i in range(10) if i % 2 == 0]
[0, 2, 4, 6, 8]

列表解析可以帮助我们在处理负责逻辑的时候,仅仅使用简单的代码就可以完成目标任务。但是由于它存在副作用:修改或产生列表,对于大数据的话,多少会对内存不友好,所以才有了生成器表达式。

生成器表达式:

生成器表达式相当于对列表解析的扩展,它是对内存有好的,因为他只是生成了一个生成器,当我们需要使用该生成器对应的逻辑目标数据时,它才会通过既定逻辑去生成该数据,所以不会大量占用内存。

它的表达式为:

(expr for iter_var in iterable)    or    (expr for iter_var in iterable if cond_expr])。与列表解析非常相似,仅仅是大括号改变为小括号。

>>> (i for i in range(10) if i % 2 == 0)
<generator object <genexpr> at 0xb772cc0c>
如上所示,生成器表达式并不会生成列表,只是生成了一个生成器。我们在使用该生成器的时候,它才会计算相应的值。

>>> max(i for i in range(10) if i % 2 == 0)
8
或是

>>> for x in (i for i in range(10) if i % 2 == 0):
...     print x,
... 
0 2 4 6 8
在使用到该生成器时,生成器会自动去迭代,完成相应的功能。








你可能感兴趣的:(列表解析与生成器表达式)