生成器理解是做什么的?它怎麽工作?我找不到关于它的教程。
发布于 2008-12-13 04:14:04
你理解列表的理解吗?如果是这样的话,生成器表达式就像一个列表理解,但它不是找到您感兴趣的所有项并将它们打包到列表中,而是等待,并逐个生成表达式中的每一项。
>>> my_list = [1, 3, 5, 9, 2, 6]
>>> filtered_list = [item for item in my_list if item > 3]
>>> print(filtered_list)
[5, 9, 6]
>>> len(filtered_list)
3
>>> # compare to generator expression
...
>>> filtered_gen = (item for item in my_list if item > 3)
>>> print(filtered_gen) # notice it's a generator object
<generator object <genexpr> at 0x7f2ad75f89e0>
>>> len(filtered_gen) # So technically, it has no length
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: object of type 'generator' has no len()
>>> # We extract each item out individually. We'll do it manually first.
...
>>> next(filtered_gen)
5
>>> next(filtered_gen)
9
>>> next(filtered_gen)
6
>>> next(filtered_gen) # Should be all out of items and give an error
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
>>> # Yup, the generator is spent. No values for you!
...
>>> # Let's prove it gives the same results as our list comprehension
...
>>> filtered_gen = (item for item in my_list if item > 3)
>>> gen_to_list = list(filtered_gen)
>>> print(gen_to_list)
[5, 9, 6]
>>> filtered_list == gen_to_list
True
>>>
因为生成器表达式一次只需要产生一项,所以它可以大大节省内存使用。生成器表达式在这样的场景中最有意义:您需要一次获取一项,根据该项进行大量计算,然后转到下一项。如果需要多个值,也可以使用生成器表达式,一次获取几个值。如果在程序执行之前需要所有的值,那么可以使用列表理解。
发布于 2008-12-13 04:08:35
发布于 2008-12-13 04:09:30
列表/生成器理解是一种构造,您可以使用它从现有列表/生成器创建新的列表/生成器。
假设您想生成从1到10的每个数字的平方列表。您可以在Python中执行此操作:
>>> [x**2 for x in range(1,11)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
在这里,range(1,11)
生成列表[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
,但在Python3.0之前,range
函数不是生成器,因此我使用的构造是列表理解。
如果我想创建一个做同样事情的生成器,我可以这样做:
>>> (x**2 for x in xrange(1,11))
<generator object at 0x7f0a79273488>
然而,在Python3中,range
是一个生成器,因此结果只取决于您使用的语法(方括号或圆括号)。
https://stackoverflow.com/questions/364802
复制相似问题