2.1.1.2 生成器表达式
创建迭代器对象的第二种方式是通过生成器表达式,这也是列表推导的基础。要增加明确性,生成器表达式通常必须被括号或表达式包围。如果使用圆括号,那么创建了一个生成器迭代器。如果使用方括号,那么过程被缩短了,我们得到了一个列表。
In [13]:
(i for i in nums)
Out[13]:
<generator object <genexpr> at 0x105fbc320>
In [14]:
[i for i in nums]
Out[14]:
[1, 2, 3]
In [15]:
list(i for i in nums)
Out[15]:
[1, 2, 3]
在Python 2.7和3.x中,列表推导语法被扩展为字典和集合推导。当生成器表达式被大括号包围时创建一个集合
。当生成器表达式包含一对键:值
的形式时创建字典
:
In [16]:
{i for i in range(3)}
Out[16]:
{0, 1, 2}
In [17]:
{i:i**2 for i in range(3)}
Out[17]:
{0: 0, 1: 1, 2: 4}
如果你还在前面一些Python版本,那么语法只是有一点不同:
In [18]:
set(i for i in 'abc')
Out[18]:
{'a', 'b', 'c'}
In [19]:
dict((i, ord(i)) for i in 'abc')
Out[19]:
{'a': 97, 'b': 98, 'c': 99}
生成器表达式非常简单,在这里没有什么多说的。只有一个疑难问题需要提及:在旧的Python中,索引变量(i)可以泄漏,在>=3以上的版本,这个问题被修正了。