最近在学习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在使用到该生成器时,生成器会自动去迭代,完成相应的功能。