1、所谓parsing/analytical expression,也称为derivation/derivation,对应英文单词理解,是Python独有的特性。解析就是从一个数据序列构造另一个新的数据序列结构。其本质是使用一个可迭代对象,按照一定的规则计算表达式、函数等后得到一个新的迭代对象,列表解析得到一个列表对象,字典解析结果成字典,集合解析结果成集合。
二、语法释义
1. List Comprehension:通过解析表达式,从可迭代对象生成新列表
[expr for iter_var in iterable]
[expr for iter_var in iterable if cond_expr]
其中:
语句中的中括号表示返回数据转换为列表。
expr为计算新列表元素值的表达式
iter_var:表示操作表达式处理的对象所在的容器。解析是将可迭代对象iter_var中的每个元素进行表达式运算后得到的值作为新列表的元素的过程;
if cond_exp:表示可迭代对象中的元素必须满足指定条件才能参与表达式操作。如果需要多个条件,可以在 if 表达式之后叠加一个 if 表达式。喜欢:
l=[chr(i+ord('A')) for i in range(26) if i%2==0 if i%3==0 if i%4==0 ]#结果为:['A', 'M', 'Y']
上面例子中:
ord(c)函数:返回字母c的unicode码,ASCII字符返回的就是ASCII码
chr(i) 函数:返回一个unicode码对应的字符,0 <= i <= 0x10ffff,如果i是ASCII码的范围,则返回ASCII字符
range 是上一节介绍的函数,这里用来生成一个 range 对象,该对象在 0 到 25 的序列上进行迭代。
上面的列表推导语句意思是:用for访问range对象的每个元素i,当元素i能被2、3、4整除,即能被12整除时,生成一个字母,ASCII码值字母的 'A' 的 ASCII 码值和 i 的值相加。按照上面的逻辑,当i为0、12、24时,满足要求,对应的字母就是结果列表中的元素。
2.集合解析:通过解析表达式,从可迭代对象生成新集合
{expr for iter_var in iterable }
{expr for iter_var in iterable if cond_expr}
集合推导和列表推导的区别在于将列表推导的方括号替换为大括号,从而判断返回值是一个集合,其他的也一样。
注意:该集合将被剔除,如果有重复值,则只保留一个。
3.字典解析:通过解析表达式从一个可迭代对象生成一个新的字典
{key_expr:value_expr for iter_var in iterable }
{key_expr:value_expr for iter_var in iterable if cond_expr }
字典解析也是使用大括号,但是必须在语句中同时指定键和值的计算表达式,确保生成的元素是使用冒号分隔的键-值对,其他的与集合解析类似。其中键的计算表达式为key_expr,值的计算表达式为value_expr。
注意:字典的键必须是唯一的,如果计算元素时键重叠,如果有重复值,则只保留一个。
示例:使用数字列表生成数字与字母映射关系的字典数据(计算方法参考上例)
d={i:chr(ord('a')+i) for i in [1,1,2,3]} ?#结果d的值为:{1: 'b', 2: 'c', 3: 'd'}
d={i:chr(ord('a')+i+index) for index,i in enumerate([1,1,2,3])}
#结果d的值为:{1: 'c', 2: 'e', 3: 'g'},enumerate函数请参考上一节的介绍
从上面的例子可以看出,重复键1只保留了一个字典元素,它保留了键的最后一个值对应的键值对。
三、补充说明
1. 生成器解析已经在生成器部分介绍过了。生成器解析其实就是生成器表达式,这里不再赘述;
2. 前面介绍中没有提到元组解析。同时,在语句外使用括号时,实际上对应的是一个生成器,而不是一个元组。因此,Python 没有元组解析的概念。如果需要通过解析得到一个元组,可以先通过列表解析和生成器解析生成一个列表或者生成器,然后通过tuple方法转换成一个元组;
3.上述解析方式虽然也可以通过语句循环赋值的方式来实现,但是解析方式更紧凑,运行速度更快;
4.解析不会改变参数中的原有迭代对象的值;
5.解析中使用多个for语句,相当于多个for循环。以下代码实现了两个列表以生成第三个列表,其元素是前两个列表的笛卡尔积:
numb=[i for i in range(2)]
abc=[chr(ord('a')+k) ?for k in range(2)]
d=[(a,n) for a in abc for n in numb]
#结果为:
[('a', 0), ('a', 1), ('b', 0), ('b', 1)]
本文为原创文章,版权归知行编程网所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ 如何在python中导入类12/14
- ♥ python函数不返回值吗?09/06
- ♥ 学习使用 Anaconda 管理虚拟环境12/23
- ♥ python带参数__init__的使用10/08
- ♥ python udp收不到数据怎么解决?10/13
- ♥ 什么是 python CGI 脚本?如何使用?01/14
内容反馈