python 推导式的使用方式(代码整洁性、高级感必备!)
前不久碰上了一个同学,和他交流了一下写代码的感想,正好他也是使用python比较多,然后他给我提了一些我可以改善的地方,比如说多使用类、使用argparse、使用推导式等,我觉得这些都是挺好用的东西,本次就简单介绍一些推导式吧。
推导式实际上就是能够将多个for循环、if判断等写到一行代码中,运行这行代码就能够生成一个列表或者一个字典或者一个集合。从这句介绍中就能看出,一行代码就能写for循环、if判断,是真的很方便啊。从网上能看到的文章中都能看到介绍说推导式是python一个必会的特色,使用推导式能让工作更方便且使任务更加省时,事实也确实是这样。那接下来就看一下推导式到底优点在哪里吧!
文章目录
推导式的形成就是多个for循环以及if语句的混合,也就是会有多层嵌套
列表推导式
正如其名,列表推导式生成的就是一个列表。先看一下不用推导式的情况:
l = []# 创建一个列表用于存放之后的结果
for first in ['A','B']:
for second in ['A','B']:
for third in ['A','B']:
l.append(lfirst,second,third])
print(l)
执行结果如下:
那使用列表推导式呢:
# print([[first,second,third] for first in ['A','B'] for second in ['A','B'] for third in ['A','B']])
# 这里为了更好看,我就使用\换行将一行代码分到多行啦!但是实际上就只是一行哦。
print([[first,second,third] \
for first in ['A','B'] \
for second in ['A','B'] \
for third in ['A','B']])
这里执行的结果和上面一样:
看出来了没,是不是很方便,将for循环写在一行上面,这样缩进就会更少,代码可读性也更好了。来分析一下这行代码,实际上就是first、second、third三个元素都进行了一次for循环,但是由于for循环的执行是有顺序的,因此最终使得结果中出现了各种组合形式,也就是说这里的一行代码和之前的好几行代码的执行结果是一样的。
接下来就注意一下,推导式的执行顺序。你应该知道列表中的元素是有顺序的,因此结果的列表中的元素也是一个一个加进去的,从结果中看出最开始生成AAA、再生成AAB,再生成ABA,再生成ABB。。。怎么样,看出来了咩?第一个元素也就是first的在结果中的前几项都是A,也就是说这里first暂停循环了,其在等待后面两项的第一轮循环结束,待second与third项生成BB也就是一轮循环结束后,first项变成了B,开始生成BAA、BAB等。从这里我们就能推知在推导式中从左到右的顺序就是for循环的执行顺序,最左边就是最外层,向右依次递减。
接下来再看一个含有if判断的推导式吧:
print([x \
for x in range(7) \
if x > 2 \
for y in range(6,10) \
if x == y])
还是如上面一样,从左到右的顺序,不使用推导式的话就长这样:
list = []
for x in range(7):
if x > 2:
for y in range(6,10):
if x==y:
list.append(x)
print(list)
结果就不展示啦,list就只有一个元素为6.
还有的情况是if、else写到一行形成列表式的情况:
print([x if x >5 else 1 for x in range(10)])
# 执行结果为:[1, 1, 1, 1, 1, 1, 6, 7, 8, 9]
# 这里代码的意思就是对10以内的整数x进行迭代,
# 如果x>5那么就将x放入列表,但是如果x不符合>5,那么就将1加入列表。
除此外,列表推导式内还可以再嵌套推导式哦!见下例子:
print([[a,b] \
for a in \
[x \
# 这里是上面的列表
for x in range(7) \
#这里是上面的列表
if x > 2 \
# 这里是上面的列表
for y in range(6,10) \
# 这里是上面的列表
if x == y ] \
# 这里是上面的列表
for b in ['A','B']])
# 由于\后不能有其它字符,我将注释写在下一行啦
# 执行结果为[[6, 'A'], [6, 'B']] ,应该没啥问题,这里也不再解释啦
看了这么多例子,对推导式有一点了解了吧,应该是觉得十分方便吧。开始想要上手的时候可能还有点不熟悉,但是只要多多使用,推导式必定会对你的工作帮助很大,你也会越来越喜欢使用推导式的。
字典推导式与集合推导式
实际上各种推导式的原理都类似,因此字典和集合推导式我简单举个例就过啦。
字典推导式
字典推导式就是生成字典的推导式,当你需要字典时就可以考虑使用字典推导式。直接看例子吧:
B = 'NAN'
print({A:B for A in range(5)})
结果如下,不再解释啦:
集合推导式
与列表的区别在于集合不含重复元素,集合内部无序,需要使用大括号{}
print({a%5 for a in range(10)})
# 计算余数,由于有重复,重复部分被去除
结果:
叮!
使用推导式的优点现在就很明显啦,方便、简洁、代码量少,缩进少,命令执行速度快(当然这个我没有证明,但是我看到有人说速度能快51%呢)。当然不是所有时候都适合用推导式哦,如果嵌套层数过多,修改代码可能很麻烦,同时也不易发现错误。当然写起来更麻烦。有的非常简单的情况可能也用不上推导式,因此根据自己的工作需要使用推导式是最好的。但是使用推导式绝对是能提升你的代码整洁性和高级感的,哈哈哈!!!
参考:https://blog.csdn.net/weixin_42057852/article/details/81120278
参考:https://www.cnblogs.com/tkqasn/p/5977653.html
参考:https://baijiahao.baidu.com/s?id=1644982404672862518&wfr=spider&for=pc
本文地址:https://blog.csdn.net/keepaware/article/details/109443923