reduce(operator.mul, L)
从上面介绍可以看出,map、filter或者reduce实际都是对序列类型数据的成员进行操作。由于这种操作在python是非常普遍的,因此在python 2.0后提供了一种叫"list的再构造"(英文名叫list comprehansions,不知道怎么翻合适)的语法形式来进行类似的操作。假设L = [1,2,3,4],那么:map((lambda x: x**2), L)就可以写成:[x**2 for x in L]。这就是所谓的"list的再构造"。认真来看看这个:
[x**2 for x in L] ===> [1,4,9,16]
首先,这个表达式用[]括起来了,表示这个表达式返回的结果是一个list。其次,后面一部分,也就是for x in L,很明显是把L中的成员依次取出来。第三,前面一部分,也就是x**2,表示对x的操作是"平方"。然后以每次计算后的值作为目标list的成员。其实可以把这一部分看成是目标list的“通项公式”,通过对这个“通项公式”代入不同的值,可以得到不同的结果。而这个“不同的值”就是由后面的部分,即for x in L,确定的。
[(x**2,x**3) for x in L] ===> [(1, 1), (4, 8), (9, 27), (16, 64)]
当然大名顶顶的"list再构造"还有别的功能,它可以加上条件从句(if语句),比如:
[x**2 for x in L if x%2==0] ===>[4,16]
"list再构造"还可以嵌套for这一部分,比如:
[x*y for x in L for y in L] ===> [1, 2, 3, 4, 2, 4, 6, 8, 3, 6, 9, 12, 4, 8, 12, 16]
相当于:
res = []
for x in L:
for y in L:
res.append(x*y)
res当然,嵌套for的"list再构造"也可以加上条件判断。比如:
[x*y for x in L if x%2==0 for y in L if y%2 != 0] ===>[2, 6, 4, 12]