-
Python解析式
在python中经常能够看到形如ret = [x ** 2 for x in lst]
这样的赋值语句,对于从C++转到python的人不太容易理解这种for循环的使用,这就是python为了简洁而发明的新语法。python解析式有以下优点:
- 代码简洁,可读性强
- 效率比普通迭代稍高
python的解析式具体分为以下四种:
- 列表解析式
- 生成器解析式
- 集合解析式
- 字典解析式
下面分别介绍这四种解析式的使用。
列表解析式
列表解析式的形式
-
[expr for e in iterator]
In [1]: lst = range(10)
In [2]: %%timeit
...: ret = [x ** 2 for x in lst]
...:
100000 loops, best of 3: 5.28 µs per loop
In [3]: %%timeit
...: ret = []
...: for x in lst:
...: ret.append(x ** 2)
...:
100000 loops, best of 3: 6.09 µs per loop # 耗时稍高
可以发现效率是要稍高一点,最主要的还是代码简洁。
列表解析式可以和if
语句一起使用
例如筛选出列表lst
中的偶数:
In [4]: ret = []
In [5]: for x in lst:
...: if x % 2 == 0:
...: ret.append(x) # 使用for循环
...:
In [6]: ret
Out[6]: [0, 2, 4, 6, 8]
In [7]: ret = [x for x in lst if x % 2 == 0] # 使用列表解析式
In [8]: ret
Out[8]: [0, 2, 4, 6, 8]
列表解析式可以像for
循环一样使用if
语句。
- 带多个if语句的,都可以转化为条件的逻辑运算, 所以一般来说,不会带多个if语句
列表解析式的for
语句可以嵌套。
In [9]: (x, y) for x in range(0, 5) for y in range(5, 10)
File "<ipython-input-9-825e2443da8b>", line 1
(x, y) for x in range(0, 5) for y in range(5, 10)
^
SyntaxError: invalid syntax
# 说明列表解析式一定要使用中括号括起来
In [10]: [(x, y) for x in range(5) for y in range(5, 10)]
Out[10]:
[(0, 5),
(0, 6),
(0, 7),
(0, 8),
(0, 9),
(1, 5),
(1, 6),
(1, 7),
(1, 8),
(1, 9),
(2, 5),
(2, 6),
(2, 7),
(2, 8),
(2, 9),
(3, 5),
(3, 6),
(3, 7),
(3, 8),
(3, 9),
(4, 5),
(4, 6),
(4, 7),
(4, 8),
(4, 9)]
In [11]: ret = []
In [12]: for x in range(5):
...: for y in range(5, 10):
...: ret.append((x, y))
...:
In [13]: ret
Out[13]:
[(0, 5),
(0, 6),
(0, 7),
(0, 8),
(0, 9),
(1, 5),
(1, 6),
(1, 7),
(1, 8),
(1, 9),
(2, 5),
(2, 6),
(2, 7),
(2, 8),
(2, 9),
(3, 5),
(3, 6),
(3, 7),
(3, 8),
(3, 9),
(4, 5),
(4, 6),
(4, 7),
(4, 8),
(4, 9)]
if
语句的特殊用法
单行if语句的写法和列表解析式很像。
表达式形式:x if cond else y
if
和else
必须同时存在。
下面以偶数求平方,奇数求立方为例进行演示
In [14]: ret = []
In [15]: for x in lst:
...: if x % 2 == 0:
...: ret.append(x ** 2)
...: else:
...: ret.append(x ** 3)
...:
In [16]: ret
Out[16]: [0, 1, 4, 27, 16, 125, 36, 343, 64, 729]
In [17]: x = 3
# if特殊用法
In [18]: x ** 2 if x % 2 == 0 else x ** 3
Out[18]: 27
In [19]: 3 if True else 4
Out[19]: 3
# 如果采用if特殊用法配合列表解析式 x if cond else y for ...
In [20]: [x ** 2 if x % 2 == 0 else x ** 3 for x in lst]
Out[20]: [0, 1, 4, 27, 16, 125, 36, 343, 64, 729]
生成器解析式
列表解析式返回的是一个列表,而生成器解析式返回的是一个解析式。列表解析式的中括号变成小括号就是生成器解析式了
In [1]: range(10000)
Out[1]: range(0, 10000)
In [2]: g = (x ** 2 for x in range(100000000000))
In [3]: g
Out[3]: <generator object <genexpr> at 0x7f9f08a5f0a0>
In [4]: next(g)
Out[4]: 0
In [5]: next(g)
Out[5]: 1
In [6]: next(g)
Out[6]: 4
列表解析式和生成器解析式的选择
- 需要用下标访问的时候,用列表解析式
- 只需要对结果迭代的时候,优先使用生成器解析式
集合解析式
将列表解析式的中括号换成大括号就是集合解析式了。
In [1]: lst = [2, 4, 5, 6, 3, 4, 2]
In [2]: s = {x for x in lst}
In [3]: s
Out[3]: {2, 3, 4, 5, 6} # 可见列表解析式生成的时候会去掉重复,符合集合要求
In [4]: type(s)
Out[4]: set
字典解析式
字典解析式使用的也是大括号,但是和集合解析式不同的是在expr
处使用的不是单个元素而是k,v
对。
In [1]: {str(x): x for x in range(5)}
Out[1]: {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4}
这四种解析式中使用最广泛的还是列表解析式,会经常有一些很巧妙的用法。
记得帮我点赞哦!
精心整理了计算机各个方向的从入门、进阶、实战的视频课程和电子书,按照目录合理分类,总能找到你需要的学习资料,还在等什么?快去关注下载吧!!!
出 处:
https://www.cnblogs.com/CHLL55/p/13748155.html
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
SQL Server -- 解决存储过程传入参数作为s
关于JS定时器的整理
JS中使用Promise.all控制所有的异步请求都完
js中字符串的方法
import-local执行流程与node模块路径解析流程
检测数据类型的四种方法
js中数组的方法,32种方法
前端操作方法
数据类型
window.localStorage.setItem 和 localStorage.setIte
如何完美解决前端数字计算精度丢失与数