2.1.1.2 生成器表达式

创建迭代器对象的第二种方式是通过生成器表达式,这也是列表推导的基础。要增加明确性,生成器表达式通常必须被括号或表达式包围。如果使用圆括号,那么创建了一个生成器迭代器。如果使用方括号,那么过程被缩短了,我们得到了一个列表。

In [13]:

  1. (i for i in nums)

Out[13]:

  1. <generator object <genexpr> at 0x105fbc320>

In [14]:

  1. [i for i in nums]

Out[14]:

  1. [1, 2, 3]

In [15]:

  1. list(i for i in nums)

Out[15]:

  1. [1, 2, 3]

在Python 2.7和3.x中,列表推导语法被扩展为字典和集合推导。当生成器表达式被大括号包围时创建一个集合。当生成器表达式包含一对键:值的形式时创建字典:

In [16]:

  1. {i for i in range(3)}

Out[16]:

  1. {0, 1, 2}

In [17]:

  1. {i:i**2 for i in range(3)}

Out[17]:

  1. {0: 0, 1: 1, 2: 4}

如果你还在前面一些Python版本,那么语法只是有一点不同:

In [18]:

  1. set(i for i in 'abc')

Out[18]:

  1. {'a', 'b', 'c'}

In [19]:

  1. dict((i, ord(i)) for i in 'abc')

Out[19]:

  1. {'a': 97, 'b': 98, 'c': 99}

生成器表达式非常简单,在这里没有什么多说的。只有一个疑难问题需要提及:在旧的Python中,索引变量(i)可以泄漏,在>=3以上的版本,这个问题被修正了。