赞
踩
任务:
我们有个任务是提取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循环 都可以用推导式进行完成,性能高比较高,但是如果场景过于复杂就不要用,可读
性要排在第一位.
谢谢浏览,有好的建议请评论 ,谢谢
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。