推导式 与 生成器表达式

来源:互联网 发布:淘宝能买到恐怖水琴吗 编辑:程序博客网 时间:2024/06/01 09:12
推导式:
       
        先讲列表推导式, 其它推导式皆与之类似.
列表推导式由一个包含表达式的中括号组成, 表达式后面跟随一个for子句, 之后可以有0个或多个for子句或if子句.
由于是用中括号括起来的, 所以得到的是一个列表, 它为从一个序列中创建列表提供了一个简单的方法.
        其实,表达式就是将存储在列表中的每一项的原型, 表达式后面的语句就是 这个原型所满足的约束条件.

        so, 列表推导式 = [ 表达式 + 约束语句]

例一:  将输出 0 ~ 9 的平方

list = [x**2 for x in range(10)]for inde in range(10):    print list[inde]



例二: 将输出两个列表中元素的笛卡尔乘积, 条件是各自列表中挑出的两个元素值不等.

a = [(x,y) for x in [1,2,3,4,5] for y in [3,4,5] if x != y]print a,



例三:

vecs = [-1,-2,-3,-4,-5]array = [abs(x)**2 for x in vecs]print array


列表推导式还可以嵌套:

官方文档上有一个经典的例子:

考虑以下的 3x4 矩阵, 一个列表中包含三个长度为4的列表:

matrix = [       [1, 2, 3, 4],       [5, 6, 7, 8],       [9, 10, 11, 12],]


如果, 现在你想交换矩阵的行和列, 可以用嵌套的列表推导式:

 print [[ROW[i] for ROW in matrix] for i in range(4)] 



同理, 集合推导式和列表推导式类似, 只是表达式外面不是中括号 [ ], 而是大括号 { },字典推导式外面也是大括号, 不同的是字典推导式中的表达式的形式是 " key : value "罢了.

生成器表达式:
        生成器表达式和上面讲述的推导式十分相似, 它是为函数服务的.  相当于将所得  列表/元组/集合/字典  当作函数的参数.

一个例子:
 
sum(i*i for i in range(10))

即计算 0 ~ 9 的平方的和, 即计算 0^2 + 1^2 + ... + 9^2 = 285
0 0