解析式/推导式, 生成器

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介:

列表解析式(List Comprehension)

       语法:

       [返回值 for 元素 in 可迭代对象 if 条件]

       使用中括号[],内部是for循环,if条件可选.

       返回一个新的列表.

 

    列表解析式的作用:

       编译器会优化,不会因为简写而影响效率,反而因优化提高了效率.

       减少程序员工作量,减少出错.

       简化代码,增强可读性.

    注意:

   

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

In [26]: newlist = [print(i) for i in range(10)]

0

1

2

3

4

5

6

7

8

9

 

In [27]: newlist

Out[27]: [None, None, None, None, None,  None, None, None, None, None]

 

In [28]: newlist = [i for i in range(10)]

 

In [29]: newlist

Out[29]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

 

-----------------------------------------------------------------------------------------------------------------------

 

In [30]: [i for i in range(20) if i%2 == 0  elif i%3 == 0]  列表解析式里面不包括else, elif.

   File "<ipython-input-30-9cc81af30c39>", line 1

     [i for i in range(20) if i%2 == 0 elif i%3 == 0]

                                         ^

SyntaxError: invalid syntax

 

 

In [31]: [i for i in range(20) if i%2 == 0  and i%3 == 0]

Out[31]: [0, 6, 12, 18]

 

In [32]:

 

举例生成一个列表,元素0~9,对每一个元素自增1后求平方并返回新列表.

   

1

2

3

4

5

6

7

8

In [23]: for i in range(10):

     ...:     lst.append((i+1)**2)

     ...:

 

In [24]: lst

Out[24]: [1, 4, 9, 16, 25, 36, 49, 64, 81,  100]

 

In [25]:

 

使用列表解析式:  

   

1

2

3

4

 

In [25]: [(i+1)**2 for i in range(10)]

Out[25]: [1, 4, 9, 16, 25, 36, 49, 64, 81,  100]

 

In [26]:

 

列表解析式进阶

       [返回值 for 元素 in 可迭代对象 if 条件1 if 条件2]

    [返回值 for 元素 in 可迭代对象 for 元素1 in 可迭代对象1]

生成器表达式(Generator expression)

       语法: (返回值 for 元素 in 可迭代对象 if 条件).

    使用小括号(). 

    返回一个生成器.

   

    和列表解析/推导式的区别:

       生成器表达式是按需计算(或称惰性求值,延迟计算),需要的时候才计算值.

       列表解析式是立即返回值.

    生成器:

       可迭代对象

       迭代器

   

    生成器表达式和列表解析式比较:  

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

In [32]: g = ("{:04}".format(i) for  i in range(1, 5))

 

In [33]: g

Out[33]: <generator object  <genexpr> at 0x000001D487ECA570>

 

In [34]: next(g)

Out[34]: '0001'

 

In [35]: for x in g:

     ...:     print(x)

     ...:

0002

0003

0004

 

In [36]: for x in g:

     ...:     print(x)

     ...:

 

In [37]:

 

总结:

延迟计算.

返回迭代器,可以迭代.

从前到后走完一遍后,不能回头.

In [39]: g = ["{:04}".format(i)  for i in range(1, 5)]

 

In [40]: g

Out[40]:

['0001',

 '0002',

 '0003',

 '0004',]

 

In [41]: for x in g:

     ...:     print(x)

     ...:

0001

0002

0003

0004

 

In [42]:

...

 

 

 

总结:

立即计算.

返回的不是迭代器,返回可迭代对象列表.

从前到后走完一遍后,可以重新回头迭代.

 

   

    总结:

生成器表达式 vs 列表解析式

 

计算方式:

        生成器表达式延迟计算,列表解析式立即计算.

内存占用:

        从返回值本身:生成器表达式省内存,列表解析式返回新的列表.

        生成器没有数据,内存占用极少,但是使用时,虽然一个个返回返回数据,但是合起来占用内存和列表解析式也差不多.

       列表解析式构造新的列表需要占用内存.

    计算速度:

       但看计算时间,生成器表达式耗时非常短,列表解析式耗时长.

       生成器本身并没返回任何值,只返回了一个生成器对象.

       列表解析式构造并返回了一个新的列表.

集合解析式

       语法: {返回值 for 元素 in 可迭代对象 if 条件}

    使用大括号{}.

    立即返回一个集合

   

    用法:

       {(x,x+1) for x in range(10)}

       {[x] for x in range(10)}

字典解析式

       语法: {返回值 for 元素 in 可迭代对象 if 条件}

    使用大括号{}. 

    使用key:value形式.

    立即返回一个字典.

   

    用法:

       {x:(x,x+1) for x in range(10)}

{x:[x,x+1] for x in range(10)}

{(x,):[x,x+1] for x in range(10)}

{[x]:[x,x+1] for x in range(10)}

{chr(0x41+x):x**2 for x inrange(10)}

    :

1

2

3

4

5

6

7

8

9

10

11

12

13

In [45]: {str(x):y for x in range(3) for y  in range(4)}

Out[45]: {'0': 3, '1': 3, '2': 3}

 

等价于:

 

dic = {}

for x in range(3):

     for y in range(4):

         dic[str(x)] = y

print(dic)

   

    总结:

       python2引入列表解析式.

       python2.4引入生成器表达式.

       python3引入集合,字典解析式,并迁移到2.7

      

       一般来说,应多用解析式,简短高效.

       如果一个解析式非常复杂,难读懂,要考虑拆解for循环.

       生成器和迭代器都是不同的对象,但都是可迭代对象



本文转自 羽丰1995 51CTO博客,原文链接:http://blog.51cto.com/13683137989/1975461
相关文章
|
存储 算法 数据处理
Python生成器深度解析:构建强大的数据处理管道
Python生成器深度解析:构建强大的数据处理管道
315 0
|
28天前
|
机器学习/深度学习 算法 安全
随机性、熵与随机数生成器:解析伪随机数生成器(PRNG)和真随机数生成器(TRNG)
随机性在密码学、仿真和机器学习等领域中至关重要,本文探讨了随机性、熵的概念以及伪随机数生成器(PRNG)和真随机数生成器(TRNG)的原理和应用。PRNG通过算法生成看似随机的序列,适用于高效需求;TRNG利用物理过程生成真正随机数,适用于高安全需求。文章还讨论了两者的协同应用及其面临的挑战。
64 5
随机性、熵与随机数生成器:解析伪随机数生成器(PRNG)和真随机数生成器(TRNG)
|
6月前
|
数据处理 Python
Python学习:迭代器与生成器的深入解析
Python学习:迭代器与生成器的深入解析
47 0
|
1月前
|
存储 数据处理 Python
深入解析Python中的生成器:效率与性能的双重提升
生成器不仅是Python中的一个高级特性,它们是构建高效、内存友好型应用程序的基石。本文将深入探讨生成器的内部机制,揭示它们如何通过惰性计算和迭代器协议提高数据处理的效率。
|
1月前
|
存储 大数据 Python
Python 中迭代器与生成器:深度解析与实用指南
Python 中迭代器与生成器:深度解析与实用指南
18 0
|
6月前
|
大数据 Python
深入解析Python中的生成器(Generator) 及其高级应用
深入解析Python中的生成器(Generator) 及其高级应用
150 0
|
6月前
|
Python
深入解析Python中的字典推导式
深入解析Python中的字典推导式
|
6月前
|
算法 安全 程序员
【C++ 随机数生成器】深入解析C++ 随机数生成器mersenne_twister_engine等
【C++ 随机数生成器】深入解析C++ 随机数生成器mersenne_twister_engine等
244 0
|
JavaScript 前端开发 API
深入解析JavaScript Generator 生成器的概念及应用场景
本文讲解了JS生成器的概念和应用场景。生成器是一个可以暂停和恢复执行的函数。利用生成器我们可以很方便地实现自定义的可迭代对象、状态机、惰性计算等,并且还能用它来简化我们的异步操作代码。
542 0
|
数据处理 Python
Python学习:迭代器与生成器的深入解析
Python学习:迭代器与生成器的深入解析
57 0
下一篇
无影云桌面