解析式

解析式

列表解析

列表解析式是将一个列表(实际上适用于任何可迭代对象(iterable))转换成另一个列表的工具。在转换过程中,可以指定元素必须符合一定的条件,才能添加至新的列表中,这样每个元素都可以按需要进行转换。

  • 列表解析返回的是列表, 列表的内容是表达式执行的结果
  • 列表解析的精髓就在第一个的for循环,所以第一个必须是for循环语句
  • 解析式速度更快
  • 代码更简洁
  • 可读性

实际使用

  • 列表解析的一般形式和其等价形式
[expr for item in itratorable]  ==>

ret = []
for item in itratorable
    ret.append(item)

实际使用举例:

In [2]: [ x ** 0.5 for x in range(5)]
Out[2]: [0.0, 1.0, 1.4142135623730951, 1.7320508075688772, 2.0]

In [8]: lst = []

In [9]: for x in range(5):
   ...:     lst.append(x ** 0.5)

In [10]: lst
Out[10]: [0.0, 1.0, 1.4142135623730951, 1.7320508075688772, 2.0]
  • 带if语句的列表解析
[expr for item in iterable if cond] =>

ret = []
for item in iterable:
    if cond:
        ret.append(expr)

实际使用举例:

In [11]: [ x ** 0.5 for x in range(10) if x % 2 == 0]
Out[11]: [0.0, 1.4142135623730951, 2.0, 2.449489742783178, 2.8284271247461903]

In [12]: lst = []

In [13]: for i in range(10):
   ....:     if i % 2 == 0:
   ....:         lst.append(i ** 0.5)    

In [14]: lst
Out[14]: [0.0, 1.4142135623730951, 2.0, 2.449489742783178, 2.8284271247461903]

带两个if语句的使用:

[expr for item in iterable if cond1 if cond2] =>

ret = []
for item in iterable:
    if cond1:
        if cond2:
            ret.append(expr)

实际使用举例:

In [15]: [ x for x in range(20) if x % 2 ==1 if x < 10 ]
Out[15]: [1, 3, 5, 7, 9]

In [16]: lst = []

In [17]: for x in range(20):
   ....:     if x % 2 ==1:
   ....:         if x < 10:
   ....:             lst.append(x)             

In [18]: lst
Out[18]: [1, 3, 5, 7, 9]
  • 两个for语句的列表解析
[expr for item1 in iterable1 for item2 in iterable2] =>

ret = []
for item1 in iterable1:
    for item2 in iterable2:
        ret.append(expr)

实际使用举例:

In [19]: [(x,y) for x in range(3) for y in range(2)]
Out[19]: [(0, 0), (0, 1), (1, 0), (1, 1), (2, 0), (2, 1)]

In [20]: lst = []

In [25]: for x in range(3):
   ....:     for y in range(2):
   ....:         lst.append((x,y))
   ....:         

In [26]: lst
Out[26]: [(0, 0), (0, 1), (1, 0), (1, 1), (2, 0), (2, 1)]

在上面的使用中我们可以看到只要第一个是for语句剩下的语句可以是一个或多个if语句也可以是一个或多个for语句。总之合理的使用列表解析能够很好的提高代码的可读性,同时也能提高性能。

In [27]: [(x,y) for x in range(3) if x % 2 == 1 for y in range(2)]
Out[27]: [(1, 0), (1, 1)]

In [28]: lst = []

In [29]: for x in range(3):
   ....:     if x % 2 == 1:
   ....:         for y in range(2):
   ....:             lst.append((x,y))
   ....:             

In [30]: lst
Out[30]: [(1, 0), (1, 1)]

生成器解析

对生成器解析来说,只需要简单的把中括号换成小括号就可以了,而生成器解析式是按需计算的或者说延迟计算或者叫惰性求值。它和列表解析的语法很像,但是在大数据量处理时,生成器表达式的优势就体现出来了,因为它的内存使用方式更好,效率更高,它并不创建一个列表,只是返回一个生成器。当然,列表解析并不会被遗弃。

(expr for iter_var in iterable) 

(expr for iter_var in iterable if cond_expr)

举例:

In [37]: def inc(x):
   ....:     print(‘inc {0}‘.format(x))
   ....:     return x+1
   ....: 

In [38]: (inc(x) for x in range(3))
Out[38]: <generator object <genexpr> at 0x7fc804c5e7d8>

In [39]: [inc(x) for x in range(3)]
inc 0
inc 1
inc 2
Out[39]: [1, 2, 3]

In [42]: g =  (inc(x) for x in range(3))

In [43]: next(g)
inc 0
Out[43]: 1

In [44]: next(g)
inc 1
Out[44]: 2

In [45]: next(g)
inc 2
Out[45]: 3
  • 使用生成器解析式时一点next的元素超出则报StopIteration的异常。
  • 生成器解析式只能一步步的向后而不能任意跳转。
  • 在列表解析中的元素是可以查看的而生成器只能通过next进行查看元素。

集合解析

  • 集合解析把列表解析的中括号变成大括号,返回集合。
  • 集合解析拥有集合的特性即:集合解析中的元素没有重复值、集合的元素必须是可哈希的否则报TypeError异常。
In [3]: s = {x for x in [2,3,4,5,3,4,2,7,8]}

In [4]: s
Out[4]: {2, 3, 4, 5, 7, 8}

字典解析

  • 字典解析也是使用大括号包围,并且需要两个表达式,一个生成key, 一个生成value 两个表达式之间使用冒号分割,返回结果是字典。
  • key是可hash的。
  • 相同的key之间后面的值会覆盖前面值。
In [12]: { str(x):y for x in range(5) for y in range(6)}
Out[12]: {‘0‘: 5, ‘1‘: 5, ‘2‘: 5, ‘3‘: 5, ‘4‘: 5}

In [13]: set = {}

In [14]: for x in range(5):
   ....:     for y in range(6):
   ....:         set[str(x)]=y
   ....:         

In [15]: set
Out[15]: {‘0‘: 5, ‘1‘: 5, ‘2‘: 5, ‘3‘: 5, ‘4‘: 5}
时间: 2024-10-10 01:46:08

解析式的相关文章

Python - 列表解析式

列表解析--用来动态地创建列表 [expr for iter_var in iterable if cond_expr] 例子一: map(lambda x: x**2, range(6)) [0, 1, 4, 9, 16, 25] [x**2 for x in range(6)] [0, 1, 4, 9, 16, 25] 列表解析式可以取代内建的map()函数以及lambda,而且++效率更高++. 例子二: seq = [11, 10, 9, 8, 7, 6] filter(lambda x

列表解析式 -- Python

列表解析的语法:[expr for iter_var in iterable], 它迭代iterable对象的所有条目.其中的expr应用于序列的每个成员,最后的结果值是该表达式产生的列表,迭代变量并不需要是表达式的一部分. #!usr/bin/env python #coding:utf-8 ''' 需求:找出出1-10内所有的奇数,并将奇数求平方 ''' print(tuple((i for i in range(11) if i%2))) print(list((i*i for i in

【python】13、解析式

1.解析式是什么?为什么要用解析式? 对一个list里所有的数值求平方 In [123]: lst = list(range(6)) In [124]: ret = [] In [125]: for i in lst:      ...:     ret.append(i ** 2)      ...:      In [126]: ret Out[126]: [0, 1, 4, 9, 16, 25] 解析式: In [127]: lst = list(range(6)) In [128]: [

轻松学会Python列表解析式(转载)

有时候,一个编程设计模式使用得十分普遍,甚至会逐步形成自己独特的语法.Python编程语言中的列表解析式(list comprehension)就是这类语法糖(syntactic sugar)的绝佳代表. Python中的列表解析式是个伟大的发明,但是要掌握好这个语法则有些难,因为它们并是用来解决全新的问题:只是为解决已有问题提供了新的语法. 接下来,我们一起来学习什么是列表解析式,以及如何掌握使用这种语法的时机. 什么是列表解析式? 列表解析式是将一个列表(实际上适用于任何可迭代对象(iter

Python - 列表解析式/生成器表达式

列表解析式: [expr for iter_var in iterable if cond_expr] 生成器表达式: (expr for iter_var in iterable if cond_expr) 二者的区别: -列表解析式需要生成所有的数据: -生成器解析式不是真正创建列表,而是返回一个生成器,这个生成器在每次计算出一个条目后,把这个条目yield出来.生成器表达式使用了延迟计算,在使用内存上更有效.

用几何画板参数如何构造动态解析式

几何画板提供丰富而方便的创造功能使用户可以随心所欲地编写出自己需要的教学课件,是最出色的教学软件之一.它主要以点.线.圆为基本元素,通过对这些基本元素的变换.构造.测算.计算.动画.跟踪轨迹等,构造出其它较为复杂的图形.下面以用参数构造几何画板动态解析式y=a(x-h)2+k为例,来看看动态解析式是如何通过参数来实现的. 具体步骤如下: 1.新建三个参数a.h.k,默认选择即可.  利用“数据”——“新建参数”新建a.h.k三个参数 2.绘制函数的图象.选择“绘图”——“绘制新函数”,弹出“新建

洛谷 P2026 求一次函数解析式

P2026 求一次函数解析式 题目背景 做数学寒假作业的怨念…… 题目描述 给定两个整点的坐标,求它们所在直线的函数解析式(一次函数). 输入输出格式 输入格式: 输入共两行. 第一行有两个整数x1,y1.表示第一个整点的坐标为(x1,y1) 第二行有两个整数x2,y2.表示第二个整点的坐标为(x2,y2) 输出格式: 输出共一行,即这个函数解析式. 输入输出样例 输入样例#1: 复制 [一] 3 6 2 4 [二] 3 5 2 7 [三] 3 -1 5 -2 输出样例#1: 复制 [一] y=

列表解析式

列表解析式 列表解析式因编译器进行优化,提高了效率,减少出错,增加可读性 语法 [返回值 for 元素 in 可迭代对象 if条件] 使用中括号[],内部是for循环,if条件语句可选 返回一个新列表 示例1: 生成一个列表,元素0-9,对每一个元素自增1后求平方返回新列表 #通常写法为: new = [] for i in range(10): new.append((i+1)**2) print(new) #使用列表解析式方法: new = [(i+1)**2 for i in range(

Python3的语法糖和解析式

Python语言发展到3.X以来,有许多语法糖,例如: 三元表达式 代码块 2.封装与解构3.解析式1).列表解析式2).集合解析式3).字典解析式解析式的作用1).Python解释器为解析式专门作了优化,多写解析式会让程序更简洁高效.2).解析式就是能把程序语句写得像函数表达式一样,体现Python3面向对象的函数式编程的特点.同过嵌套的解析式,搭建程序的骨架,然后替换相应的数据结构头部(比如列表解析式的头部为列表...),就能优雅 高效地构造出一般的程序. 原文地址:http://blog.