奇技淫巧,还是正统功夫? - Python推导式最全用法
前言
本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。
PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取
1.Pythonic - 很Python
写一段代码生成1到100之间的数字的平方的列表,答案是:
1,4,9,16...
如果你这样写,你就不Pythonic了:
nums = []
for i in range(1,101):
nums.append(i*i)
print(nums)
正确的写法是使用Python的推导式:
nums = [i*i for i in range(1,101)]
2.带条件的推导式
生成一个列表,包含1到100之间是3的倍数的数字的方法:
9,36,81...
代码:
nums = [i*i for i in range(1,101) if i%3==0]
3.带条件的表达式
生成一个列表,如果是3的倍数就用平方,否则就用是数字本身:
1,2,9,4,5,36...
代码:
nums = [i*i if i%3==0 else i for i in range(1,101)]
结合上面的3个例子,来看一下推导式总结:
- 推导式从一个可枚举数据(列表,元组,集合,字典等)推导出一个列表。也可以推导出生成器,集合或字典。
- 推导式可以加推导条件,只对符合条件的元素推导
- 要推导出的元素使用表达式生成,可以用if else生成不同元素
[表达式 if 表达式条件 else 分支 for i in 序列 if 推导条件]
4.使用函数
如果推导条件或者表达式特别复杂怎么办?可以使用函数。
推导所有1-100之间的所有质数:2,3,5,7...
def is_prime(num):
if num == 1:
return False
for i in range(2,num):
if (num % i) == 0:
return False
else:
return True
p_nums = [i for i in range(1,100) if is_prime(i)]
print(p_nums)
把推导的条件放在函数中,既可以应对复杂的条件,又可以利用推导式的简洁写法。
同理,如果生成推导结果的过程很复杂,也可以把逻辑放到函数中。
推导1900到2021年之间所有的年份,标记出闰年,生成结果:
1900, 1901, 1902, 1903, '闰1904'
代码:
def is_run(year):
if (year % 4) == 0:
if (year % 100) == 0:
if (year % 400) == 0:
return True # 整百年能被400整除的是闰年
else:
return False
else:
return True # 非整百年能被4整除的为闰年
else:
return False
ryears = [f'闰{y}' if is_run(y) else y for y in range(1900, 2021)]
print(ryears)
5.嵌套表达式 - 不推荐使用
从2000年到2021年,生成每个月份:'2000年:1月', '2000年:2月', '2020年:3月', ..., '2021年:12月'
monthes = [f'{y}年:{m}月' for y in range(2000, 2022) for m in range(1,13) ]
这里有两个for循环,类似于:
monthes = []
for y in range(2000, 2022):
for m in range(1,13):
monthes.append(f'{y}年:{m}月')
6.推导巨大的列表 - 不要这么干!
推导出1到100亿之间的数字的平方,代码如下:
nums = [i*i for i in range(1,10000000000)]
但是这段代码很可能会卡死你的电脑,除非你的电脑是超级计算机。因为它要在内存中做100亿次计算,然后保存这100亿个数字。
7.使用生成器
这种情况下,我们应该使用推导生成器,用法很简单:
- 把方括号改成圆括号就可以了
nums = (i*i for i in range(1,10000000000))
print(nums)
print(next(nums))
print(next(nums))
print(next(nums))
打印出来是一个生成器:
<generator object <genexpr> at 0x7fa0b422feb0>
1
4
9
这是一个生成器,它不会一次性生成100亿个数字,只有调用next()的时候,它才会生成一个新的,返回给你。也就是说,同一个时间,只保存一个数字。
8.推导字典
推导字典的方式和推导列表很相似,只不过:
- 使用大括号
- 使用键值对
推导一个包含数字和数字平方组成的字典,结果是这样的:
{1: 1, 2: 4, 3: 9, ..., 100: 10000}
代码:
nums_dict = {n:n*n for n in range(1,101)}
print(nums_dict)
反过来,平方在前面,数字在后面:
nums_dict = {n*n:n for n in range(1,101)}
print(nums_dict)
给下面的字典按照分数排序:
{'麦叔':59, '张三':87, 'FGA':78, '石石':100, '莫名':90}
排序结果:
{'石石': 100, '莫名': 90, '张三': 87, 'FGA': 78, '麦叔': 59}
代码:
scores = {'麦叔':59, '张三':87, 'FGA':78, '石石':100, '莫名':90}
sored_scores = {item[0]:item[1] for item in sorted(scores.items(), key=lambda item:item[1], reverse=True)}
print(sored_scores)
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.集合会自动过滤掉重复的元素。
下面的名字列表,去掉前后空格后去掉重复的名字:
[ '麦叔', '张三', ' 麦叔 ', 'FGA ', '张小三', 'FGA', '石石',' 莫名','莫名' ]
推导结果:
{'石石', 'FGA', '张小三', '莫名', '张三', '麦叔'}
代码:
names = [ '麦叔', '张三', ' 麦叔 ', 'FGA ', '张小三', 'FGA', '石石',' 莫名','莫名' ]
new_names = {n.strip() for n in names}
print(new_names)
奇技淫巧,还是正统功夫? - Python推导式最全用法的更多相关文章
- python推导式pythonic必备【华为云技术分享】
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/devcloud/article/detai ...
- python推导式pythonic必备
编程规范 今天公司新出了一套Python编程规范2.0,一直觉得自己写代码路子有点野,所以仔细的看了下. 多数的内容在网上都能搜到,但有几点需要说说 让我觉得羞愧的注释率 公司要求代码注释行,占代码总 ...
- Python推导式详解,带你写出比较精简酷炫的代码
Python推导式详解,带你写出比较精简酷炫的代码 前言 1.推导式分类与用法 1.1 列表推导 1.2 集合推导 1.3 字典推导 1.4 元组推导?不存在的 2.推导式的性能 2.1 列表推导式与 ...
- Python推导式
Python推导式 推导式:是Python中提供的一个非常方便的功能,可以通过一行代码实现创建 list.dict.tuple.set的同时初始化一些值. 1.列表推到式 # -*- coding: ...
- python推导式与海象运算符
背景:介绍两种python用于语句优化的用法 一.推导式 1.推导式简介: Python 推导式是一种独特的数据处理方式,可以从一个数据序列构建另一个新的数据序列的结构体. 支持:列表(list).元 ...
- Python正则式的基本用法
Python正则式的基本用法 1.1基本规则 1.2重复 1.2.1最小匹配与精确匹配 1.3前向界定与后向界定 1.4组的基本知识 2.re模块的基本函数 2.1使用compile加速 2.2 ma ...
- python 推导式和迭代器、生成器
1.常用推导式 推导式是从一个或者多个迭代器快速简洁创建数据结构的一种方法. 1.1 _ 列表推导式 最简单的形式: [exprssion for item in iterable] 示例: nu ...
- python 推导式
推导式又称解析式,是Python的一种独有特性.目的是可以从一个数据序列推导出另一个数据序列,适用于python 的list ,dict 和集合 list中的推导式: _list=[i for i i ...
- Python 推导式、迭代器、生成器、模块和包
一.推导式 (一).列表推导式(集合推导式也同理于此) 利用列表推导式,取出1-20内所有偶数 li = [i for i in range(1, 21) if i % 2 == 0] # 如果只有一 ...
随机推荐
- easyui form提交时验证必填,打开时不显示必填提示
给textbox添加required:true属性后,打开页面时整个表单都是红的,需要将其设置为提交时再验证. 解决方法:通过textbox的novalidate属性来控制是否开启验证 <inp ...
- jmeter__问题记录,中文乱码问题(json参数化)
这种情况在jmeter3.0的版本中才会产生,注意:这不是乱码,而是由于3.0中优化body data后,使用默认的字体(Consolas)不支持汉字的显示.这样的情况可以这样调整:进入jmeter. ...
- Docker(一):Docker安装
简介 Docker是dotcloud公司开源的一款产品,主要基于PAAS平台为开发者提供服务.是解决运行环境和配置问题软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术. Docker组件 ...
- mysql-创建用户报错ERROR 1396 (HY000): Operation CREATE USER failed for 'XXXX'@'XXXX'
创建用户: create user 'test'@'%' identified by 'test'; 显示ERROR 1396 (HY000): Operation CREATE USER faile ...
- css 08-CSS属性:定位属性
08-CSS属性:定位属性 CSS的定位属性有三种,分别是绝对定位.相对定位.固定定位. position: absolute; <!-- 绝对定位 --> position: relat ...
- 个人微信公众号搭建Python实现 -个人公众号搭建-处理消息和事件(14.3.4)
@ 目录 1.消息处理 2.事件处理 3.返回处理 关于作者 1.消息处理 现在只处理text文本消息 没有关键字的就交给qingyunke机器人去应付,这是一个免费的对话api 从配置文件中读取关键 ...
- php 文件上传错误
假设文件上传字段的名称img,则: $_FILES['img']['error']有以下几种类型 1.UPLOAD_ERR_OK 其值为 0,没有错误发生,文件上传成功. 2.UPLOAD_ERR_I ...
- CentOS7下常用安装软件服务rpm方式的介绍
简介:介绍rpm软件包的管理 rpm安装:安装别人编译好的软件包,rpm即Redhat Package Manager,是Redhat的软件包管理方式 rpm安装优点: 软件已经编译打包,所以传输 ...
- Windows 64位下安装Redis 以及 可视化工具Redis Desktop Manager的安装和使用
二.下载Windows版本的Redis 由于现在官网上只提供Linux版本的下载,所以我们只能在Github上下载Windows版本的Redis Windows版本的Redis下载地址:https:/ ...
- 解决qt程序运行时的cannot create Qt for Embedded Linux data directory: /tmp/qtembedded-0
方法1: 1.mkdir /tmp 2.挂载 mount -t tmpfs -o size=32m none /tmp 方法2: 上面的user 0h说明你是以root用户的身份运行.可以尝试切换一下 ...