[Python]学习:黑魔法之列表推导式(list comprehension)

[Python]学习:黑魔法之列表推导式(list comprehension)

在学习python的时候看到一个不同于我以前学过的语言的语法糖,(list comprehension)列表推导式,这样玩意让我觉得有数学的美感。

列表推导式格式为
[表达式 for 变量 in 列表] 或者 [表达式 for 变量 in 列表 if 条件]

    y=[x*x for x in range(10)]
    print(y)

运行结果:

[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

一行简单的语句就完成了如复杂操作

def square_list(count):
    list = []
    for i in range(count) :
        list.append(i)
    return list
y = square_list(10);

不止于此列表推到式还可以增加更多的for 来形成相当多层 for循环的效果

    z = [y for x in range(10) for y in range(10)];

这个语句相当于

    z =[]
    for x in range(10):
        for y in range(10):
            z.append(y)

数据的输出结果是

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

我们也可以生成更多表项的列表

    z = [(x,y) for x in range(10) for y in range(10)]

输出结果

    [(0, 0), (0, 1), (0, 2), (0, 3), (0, 4), (0, 5), (0, 6), (0, 7), (0, 8), (0, 9), (1, 0), (1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (1, 7), (1, 8), (1, 9), (2, 0), (2, 1), (2, 2), (2, 3), (2, 4), (2, 5), (2, 6), (2, 7), (2, 8), (2, 9), (3, 0), (3, 1), (3, 2), (3, 3), (3, 4), (3, 5), (3, 6), (3, 7), (3, 8), (3, 9), (4, 0), (4, 1), (4, 2), (4, 3), (4, 4), (4, 5), (4, 6), (4, 7), (4, 8), (4, 9), (5, 0), (5, 1), (5, 2), (5, 3), (5, 4), (5, 5), (5, 6), (5, 7), (5, 8), (5, 9), (6, 0), (6, 1), (6, 2), (6, 3), (6, 4), (6, 5), (6, 6), (6, 7), (6, 8), (6, 9), (7, 0), (7, 1), (7, 2), (7, 3), (7, 4), (7, 5), (7, 6), (7, 7), (7, 8), (7, 9), (8, 0), (8, 1), (8, 2), (8, 3), (8, 4), (8, 5), (8, 6), (8, 7), (8, 8), (8, 9), (9, 0), (9, 1), (9, 2), (9, 3), (9, 4), (9, 5), (9, 6), (9, 7), (9, 8), (9, 9)]

如果你并不是想要一个顺序的列表而是比如说要 5的倍数这样的值我们也可以通过给列表推导式添加if来生成我们要的列表

    z = [ x for x in range(100) if x%5 == 0 ]

这样就能得到我们想要的列表了

[0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95]

同样的对多重的列表推导式也有用

    z= [(x,y) for x in range(10) for y in range(10) if x == y ]
[(0, 0), (1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6), (7, 7), (8, 8), (9, 9)]

使用for if for if 的方式也可以进行

  z = [ (x,y) for x in range(100) if x%5 == 0 for y in range(100) if y%5 == 0 and x == y]
[(0, 0), (5, 5), (10, 10), (15, 15), (20, 20), (25, 25), (30, 30), (35, 35), (40, 40), (45, 45), (50, 50), (55, 55), (60, 60), (65, 65), (70, 70), (75, 75), (80, 80), (85, 85), (90, 90), (95, 95)]

我们有时候不止需要只是单纯的数字也可是是函数的返回值或者表达式

def numberString(number) :
    return'number:'+str(number)
z = [numberString(x)+'$' for x in range(1)]

这样就可以得到我们想要的字符串列表了

    ['number:0$', 'number:1$', 'number:2$', 'number:3$', 'number:4$', 'number:5$', 'number:6$', 'number:7$', 'number:8$', 'number:9$']

总结:
这个方式生成的代码可以使得代码很优雅,但是对于其他程序员(其他语言)来说这种方式的语句可读性不太好。
参考
《Python基础教程 第二版 修订版》P82
官方指南

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值