1.列表解析:
列表解析,List comprehensions,源自函数式编程语言Haskell,是一个非常有用、简单灵活的工具,可以用来动态创建列表。
列表解析的语法:
[expr for iter_var in iterable]
虽然python中内建函数map()和filter(),lambda等支持函数式编程特征,但是列表解析表达式可以取代内建的这些函数以及lambda,且效率更高。
例如,生成一些平方数。
可以使用map()和lambda:
>>> map(lambda x: x ** 2, range(10))
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
也可以使用列表解析来替换:
>>> [x ** 2 for x in range(10)]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
使用列表解析,只有一次调用range(),而先前的语句有三次函数调用(range()、map()和lambda)。
另外列表解析还提供了过滤条件,加上if语句:
[expr for iter_var in iterable if cond_expr]
例如,筛选出奇数的平方:
>>> filter(lambda x: (x % 2) ** 2, seq)
[1, 9, 25, 49, 81]
也可以使用列表解析来完成:
>>> [x ** 2 for x in range(10) if x % 2]
[1, 9, 25, 49, 81]
还可以使用列表解析进行嵌套循环:
>>> [(x+1,y+3) for x in range(2) for y in range(3)]
[(1, 3), (1, 4), (1, 5), (2, 3), (2, 4), (2, 5)]
还有更多的例子不在此列举了。
2.生成器表达式:
生成器表达式是列表解析的一个扩展。列表解析的不足之处是需要生成所有数据,用以创建整个列表,在有大量数据的情况下,会占用更多的内存空间。
生成器表达式通过结合列表解析和生成器解决了整个问题。
生成器是特定的函数,允许返回一个值,然后“暂停”代码的执行,稍后恢复,使用关键字yield。
生成器表达式,并不真正创建列表,而是返回一个生成器,生成器表达式使用了延迟计算,使得内存使用上更有效。
语法格式:
(expr for iter_var in iterable if cond_expr)
生成器表达式和列表解析格式很相似,只不过生成器表达式返回的是一个生成器。
>>> g = (x ** 2 for x in range(10))
>>> g
<generator object <genexpr> at 0x01AA7F80>