列表解析
在需要改变列表而不是需要新建列表时,可以使用列表解析。列表解析表达式:
[exp for iter_var in iterable]
第一种语法:首先迭代iterable里所有内容,每一次迭代,都把iterable里相应内容放到iter_var中,再在表达式中应用该iter_var的内容,最后用表达式的计算值生成一个列表。
[exp for iter_var in iterable if cond_exp]
第二种语法:加入了判断语句,只有满足条件的内容才把iterable里相应内容放到iter_var中,再在表达式中应用该iter_var的内容,最后用表达式的计算值生成一个列表。
例:
生成一个3行5列矩阵
L = [(x + 1, y + 1) for x in range(3) for y in range(5)]
L
[(1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (2, 1), (2, 2), (2, 3), (2, 4), (2, 5), (3, 1), (3, 2), (3, 3), (3, 4), (3, 5)]
遴选大于5的数参与计算
N = [x + 10 for x in range(10) if x > 5]
N
[16, 17, 18, 19]
生成器表达式
生成器表达式是在python2.4中引入的,当序列过长, 而每次只需要获取一个元素时,应当考虑使用生成器表达式而不是列表解析,也就是说采用了一个更加友好的内存结构。生成器表达式的语法和列表解析一样,只不过生成器表达式是被()括起来的,而不是[],如下:
(exp for iter_var in iterable)
(exp for iter_var in iterable if cond_exp)
例:
L = (i + 1 for i in range(10) if i % 2)
L