Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python解析式

Python解析式

作者头像
职场亮哥
发布于 2020-10-10 03:28:24
发布于 2020-10-10 03:28:24
38300
代码可运行
举报
文章被收录于专栏:职场亮哥职场亮哥
运行总次数:0
代码可运行

Python解析式

python中经常能够看到形如ret = [x ** 2 for x in lst]这样的赋值语句,对于从C++转到python的人不太容易理解这种for循环的使用,这就是python为了简洁而发明的新语法。python解析式有以下优点:

  • 代码简洁,可读性强
  • 效率比普通迭代稍高

python的解析式具体分为以下四种:

  • 列表解析式
  • 生成器解析式
  • 集合解析式
  • 字典解析式

下面分别介绍这四种解析式的使用。

列表解析式

列表解析式的形式

  • [expr for e in iterator]
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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中的偶数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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语句可以嵌套。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

ifelse必须同时存在。

下面以偶数求平方,奇数求立方为例进行演示

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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]

生成器解析式

列表解析式返回的是一个列表,而生成器解析式返回的是一个解析式。列表解析式的中括号变成小括号就是生成器解析式了

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

列表解析式和生成器解析式的选择

  • 需要用下标访问的时候,用列表解析式
  • 只需要对结果迭代的时候,优先使用生成器解析式

集合解析式

将列表解析式的中括号换成大括号就是集合解析式了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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对。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
In [1]: {str(x): x for x in range(5)}
Out[1]: {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4}

这四种解析式中使用最广泛的还是列表解析式,会经常有一些很巧妙的用法。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-01-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python格式化文件存储---XML
结构化文件存储 xml, json 为了解决不同设备之间信息交换 xml jsonXML文件 参考资料 https://docs.python.org/3/library/xml.etree.elementtree.html http://www.runoob.com/python/python-xml.html https://blog.csdn.net/seetheworld518/article/details/49535285 XML(eXtensibleMarkupLanguage), 可扩展标记
ruochen
2021/05/11
6.7K0
Python格式化文件存储---XML
XmlDocument使用
大家好,又见面了,我是你们的朋友全栈君。 private XmlDocument xmlDoc;
全栈程序员站长
2022/06/28
4950
python开发_xml.dom_解析XML文档_完整版_博主推荐
在阅读之前,你需要了解一些xml.dom的一些理论知识,在这里你可以对xml.dom有一定的了解,如果你阅读完之后。
Hongten
2018/09/13
6530
python开发_xml.dom_解析XML文档_完整版_博主推荐
python使用dom操作xml
1、xml的内容为del.xml,如下 <?xml version="1.0" encoding="utf-8"?> <catalog> <maxid>4</maxid> <login
py3study
2020/01/09
1.9K0
MySQL练习sql脚本(某校学生管理系统版本)
环境下载与安装教程:【https://laoshifu.blog.csdn.net/article/details/118991473】
红目香薰
2022/11/29
6710
MySQL练习sql脚本(某校学生管理系统版本)
SAX解析XML
数据量大的xml建议使用SAX解析提高解析速度。SAX是Simple API for XML的缩写,它是事件驱动的,它并不需要读入整个文档,而文档的读入过程也就是SAX的解析过程。所谓事件驱动,是指一种基于回调(callback)机制的程序运行方法。
HUC思梦
2020/09/03
2.4K0
程序猿小明需要为公司员工的个人信息录入编写前端代码,html +css +js正则表达式 实现个人信息登录表
程序猿小明需要为公司员工的个人信息录入编写前端代码,效果如下图 需求:要保证信息录入格式正确无遗漏(输入有误要给到对应提示) 我写的代码如下 : 可以借鉴 抄袭没意思 <!DOCTYP
编程张无忌
2021/01/26
5140
程序猿小明需要为公司员工的个人信息录入编写前端代码,html +css +js正则表达式 实现个人信息登录表
python读取xml文件
xml即可扩展标记语言,它可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。
py3study
2020/01/10
4.1K0
使用tinyxml2库解析xml
tinyxml2是c++编写的轻量级的xml解析器,而且是开放源代码的,在一些开源的游戏引擎中用的比较多。源码托管在github上。 源码地址:https://github.com/leethomason/tinyxml2
全栈程序员站长
2022/08/22
1K0
使用tinyxml2库解析xml
C# 解析XML「建议收藏」
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/158781.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/14
9980
预热挖掘SQL注入
http请求中的user-agent,client-ip,x-forward-for等可能会被程序存储到数据库中的地方。另外,在订单处理的地方,由于业务逻辑复杂,经常会有二次注入漏洞。
天钧
2019/07/25
6600
预热挖掘SQL注入
Dom4j解析XML(详解)
DOM解析要求解析器将整个XML文件全部加载到内存中,生成一个Document对象。 1.优点:元素和元素之间保留结构,关系,可以针对元素进行增删改查操作。 2.缺点:如果XML文件过大,可能会导致内存溢出。
全栈程序员站长
2022/08/31
3.6K0
Dom4j解析XML(详解)
数据库技术:XML
XML -- Extensible Markup Language,即可扩展标记语言。
RendaZhang
2020/09/08
3K0
数据库技术:XML
[935]python解析xml文件
XML 指可扩展标记语言(eXtensible Markup Language)。
周小董
2021/01/29
1.6K0
SpringMVC 获取请求参数
将HttpServletRequest作为控制器方法的形参,此时HttpServletRequest类型的参数表示封装了当前请求的请求报文的对象
用户9615083
2022/12/25
1.4K0
SpringMVC 获取请求参数
jQuery/javascript实现网页注册的表单验证
1 <html> 2 <head> 3 <meta charset="utf-8"> 4 <title>注册表单验证</title> 5 <script src="jquery.j
别先生
2017/12/29
2.8K0
jQuery/javascript实现网页注册的表单验证
java学习:使用dom4j读写xml文件
dom4j是一个优秀的开源项目,专用于xml文件的读写,而且支持强大的xpath. 下面的代码演示了对xml文件demo.xml的读写 demo.xml内容: 1 <?xml version="1.
菩提树下的杨过
2018/01/24
1.4K0
python解析xml文件(解析、更新、写入)
这篇博客内容将包括对XML文件的解析、追加新元素后写入到XML,以及更新原XML文件中某结点的值。使用的是python的xml.dom.minidom包,详情可见其官方文档:xml.dom.minidom官方文档。全文都将围绕以下的customer.xml进行操作:
全栈程序员站长
2022/09/14
3.2K0
MyBatis
今天开始学习我自己总结的 Java-学习路线 中的《MyBatis》,小简从 0 开始学 Java 知识,并不定期更新所学笔记,期待一年后的蜕变吧!<有同样想法的小伙伴,可以联系我一起交流学习哦!>
小简
2023/01/30
1.7K0
Mybatis-Plus实践学习(三十四)
用户1289394
2024/03/06
1320
Mybatis-Plus实践学习(三十四)
相关推荐
Python格式化文件存储---XML
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验