奇技淫巧,还是正统功夫? - Python推导式最全用法
前言
本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。
PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取
1.Pythonic – 很Python
写一段代码生成1到100之间的数字的平方的列表,答案是:
如果你这样写,你就不Pythonic了:
正确的写法是使用Python的推导式:
2.带条件的推导式
生成一个列表,包含1到100之间是3的倍数的数字的方法:
代码:
3.带条件的表达式
生成一个列表,如果是3的倍数就用平方,否则就用是数字本身:
代码:
结合上面的3个例子,来看一下推导式总结:
- 推导式从一个可枚举数据(列表,元组,集合,字典等)推导出一个列表。也可以推导出生成器,集合或字典。
- 推导式可以加推导条件,只对符合条件的元素推导
- 要推导出的元素使用表达式生成,可以用if else生成不同元素
4.使用函数
如果推导条件或者表达式特别复杂怎么办?可以使用函数。
推导所有1-100之间的所有质数:2,3,5,7…
把推导的条件放在函数中,既可以应对复杂的条件,又可以利用推导式的简洁写法。
同理,如果生成推导结果的过程很复杂,也可以把逻辑放到函数中。
推导1900到2021年之间所有的年份,标记出闰年,生成结果:
代码:
5.嵌套表达式 – 不推荐使用
从2000年到2021年,生成每个月份:’2000年:1月’, ‘2000年:2月’, ‘2020年:3月’, …, ‘2021年:12月’
这里有两个for循环,类似于:
6.推导巨大的列表 – 不要这么干!
推导出1到100亿之间的数字的平方,代码如下:
但是这段代码很可能会卡死你的电脑,除非你的电脑是超级计算机。因为它要在内存中做100亿次计算,然后保存这100亿个数字。
7.使用生成器
这种情况下,我们应该使用推导生成器,用法很简单:
- 把方括号改成圆括号就可以了
打印出来是一个生成器:
这是一个生成器,它不会一次性生成100亿个数字,只有调用next()的时候,它才会生成一个新的,返回给你。也就是说,同一个时间,只保存一个数字。
8.推导字典
推导字典的方式和推导列表很相似,只不过:
- 使用大括号
- 使用键值对
推导一个包含数字和数字平方组成的字典,结果是这样的:
代码:
反过来,平方在前面,数字在后面:
给下面的字典按照分数排序:
排序结果:
代码:
1.先把字典scores变成一个元组列表:scores.items()
2.用sorted函数给元组列表排序:sorted(scores.items(), key=lambda item:item[1], reverse=True)
3.排序过程用lambda指定使用元组的第二列排序:key=lambda item:item[1]。默认是是第一列。
4.指定倒着排序,也就是分数高的在前面:reverse=True
5.使用推导式,把排好序的元组列表,生成一个新的排好序的字典:{item[0]:item[1] for item in … }
9.推导集合Set
推导集合的方式和列表是一样的,区别在于:
1.使用大括号,类似于推导字典,但它是单个元素,而不是键值对。
2.集合会自动过滤掉重复的元素。
下面的名字列表,去掉前后空格后去掉重复的名字:
推导结果:
代码: