天天看点

python3:列表推导式,生成器表达式,字典推导式 三种用法讲解

列表推导式

任务:

我们有个任务是提取0—20的奇数位.

1.首先我们想到的是用for循环加if做到,如下:

b=[]
for i in range(21):
    if i%2==1:
        b.append(i)
print(b)

           

2.懂list 也可以想到这样的用法:

b=list(range(21))
print(b)
print(b[1::2])
           

都可以打印出这样的结果:

[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]

           

用第二种方法是有局限性,如果过于复杂的场景并不适用,现在我们隆重的介绍列表推导式

3.列表推导式

b=list(range(21))
b=[i for i in b if i%2==1]  
print(b)
           

我们只用一行代码就解决了我们的任务,下边我介绍更复杂的场景

任务:我们要抽取 0-20的奇数并计算其平方.

def square(i):
    return i*i
b=list(range(20))

b=[square(i) for i in b if i%2==1]

print(b)
           

打印结果:

[1, 9, 25, 49, 81, 121, 169, 225, 289, 361]
           

代码很简单应该都能看懂. 解析下结果结构

[i for i in b if i%21] ,有三个结构 i,for i in b,if i%21

1.i 是指填充到列表的值

2.for i in b 是遍历b

3.if i%2==1 对循环的值进行过滤.

注意:这种方式只适合简单的场景,性能高于列表操作

过于复杂我们就不需要用了,可读性是我们追求的

生成器表达式

我们稍微改变下 如下:

b=list(range(21))
b=(i for i in b if i%2==1)
print(b)
           

打印结果:

<generator object <genexpr> at 0x000000000221AE60>
           

通过结果分析出显示了generator 这就是生成器的标识,不要以为用小括号就是

set,tuple.这个注意下.

他自己是可以遍历的,如下:

b=list(range(21))
b=(i for i in b if i%2==1)

for i  in b:
    print(i)
           

打印结果:

1
3
5
#
           

生成器的内部原理和适用场景,以后我会在专门的章节写,不是本章节的重点.

字典推导式

上边介绍了用一行代码可以生成list,我们同样的原理也可以生成dict.

参考如下的代码

b={"boby1":30,"boby2":60}

dict={value:(key+1) for value,key in b.items() }

print(dict)
           

和上边的区别是【】变成了{}, 里面的原理是一样的,换汤不换药.

总结:

简单的for循环 都可以用推导式进行完成,性能高比较高,但是如果场景过于复杂就不要用,可读

性要排在第一位.

谢谢浏览,有好的建议请评论 ,谢谢