Python 列表推导式和生成器表达式的区别

列表推导式:
和列表一样,也采用方括号 [] 表示,并且用到了一个简写版的 for 循环,将推导式开始的那个表达式映射到每一个匹配的元素上去。

1.  >>> even_numbers = [x for x in range(10) if x%2 == 0]  
2.  >>> even_numbers  
3.  [0,2,4,6,8]  
还可以使用两层循环,可以生成全排列:

>>> [m + n for m in 'ABC' for n in 'XYZ']
['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']

生成器表达式 (generator expression):
除了它有一种称之为 “惰性计算” 的特点以外,它和列表推导式的用法基本一致,只不过是把一对中括号 [] 变换为一对小括号 ()。它的工作方式是每次处理一个对象,而不是一口气处理和构造整个数据结构,这样做的潜在优点是可以节省大量的内存,在处理大量的数据是,最好考虑生成器表达式而不是列表推导式。

1.  >>> even_numbers = (x for x in range(10000) if x%2 == 0)  
2.  >>> even_numbers  
3.  <generator object at 0x....>  

另一个列表推导式和生成器表达式的例子是:

1.  >>> data = ['abc','def','I use python', 'hong201']  
2.  >>> sum([len(word) for word in data])  
3.  25  
4.  >>> sum(len(word) for word in data)  
5.  25  

enumerate() 是一个同时能让你迭代和计数的内置函数,而 for 循环自身只能迭代而没办法计数:
注:enumerate() 函数用于将一个可遍历的数据对象 (如列表、元组或字符串) 组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。

1.  >>> data = [123,"abc",3.14]  
2.  >>> for i in enumerate(data):  
3.  ...     print i  
4.  ...  
5.  (0, 123)  
6.  (1, 'abc')  
7.  (2, 3.14)

另一个区别:
迭代器(多迭代):可以多次迭代

>>> myiterator = [x*x for x in range(3)]
>>> for x in myiterator:
...     print(x)
...
0
1
4
>>> for x in myiterator:
...     print(x)
...
0
1
4

生成器(单迭代):只能迭代一次

>>> mygenerator = (x*x for x in range(3))
>>> for x in  mygenerator:
...     print(x)
...
0
1
4
>>> for x in  mygeneration:
...     print(x)
...
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'mygeneration' is not defined
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容