Python生成器表达式
示例
生成器表达式与列表推导非常相似。主要区别在于它不会立即创建完整的结果集;它创建了一个生成器对象,然后可以对其进行迭代。
例如,请参见以下代码中的区别:
#清单理解 [x**2 for x in range(10)] #输出:[0、1、4、9、16、25、36、49、64、81]
#生成器理解 (x**2 for x in xrange(10)) # Output: <generator object <genexpr> at 0x11b4b7c80>
这是两个非常不同的对象:
列表推导返回一个list对象,而生成器推导返回一个对象generator。
generator无法为对象建立索引,而是无法使用该next函数按顺序获取项目。
注意:我们使用xrange它是因为它也会创建一个生成器对象。如果我们使用范围,则会创建一个列表。此外,xrange仅在更高版本的python2中存在。在python3中,range仅返回生成器。有关更多信息,请参见range和xrange函数之间的差异示例。
g = (x**2 for x in xrange(10)) print(g[0])
Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'generator' object has no attribute '__getitem__'
g.next() #0 g.next() #1 g.next() #4 ... g.next() #81 g.next() #引发StopIteration异常
Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration