首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >生成器理解到底是如何工作的?

生成器理解到底是如何工作的?
EN

Stack Overflow用户
提问于 2008-12-13 03:55:45
回答 7查看 75.6K关注 0票数 116

生成器理解是做什么的?它怎麽工作?我找不到关于它的教程。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2008-12-13 04:14:04

你理解列表的理解吗?如果是这样的话,生成器表达式就像一个列表理解,但它不是找到您感兴趣的所有项并将它们打包到列表中,而是等待,并逐个生成表达式中的每一项。

代码语言:javascript
复制
>>> 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
>>> 

因为生成器表达式一次只需要产生一项,所以它可以大大节省内存使用。生成器表达式在这样的场景中最有意义:您需要一次获取一项,根据该项进行大量计算,然后转到下一项。如果需要多个值,也可以使用生成器表达式,一次获取几个值。如果在程序执行之前需要所有的值,那么可以使用列表理解。

票数 180
EN

Stack Overflow用户

发布于 2008-12-13 04:08:35

生成器理解是列表理解的懒惰版本。

它就像一个列表理解,除了它返回一个迭代器而不是列表,即一个带有next()方法的对象,它将产生下一个元素。

如果您不熟悉列表理解,请参阅here;有关生成器,请参阅here

票数 31
EN

Stack Overflow用户

发布于 2008-12-13 04:09:30

列表/生成器理解是一种构造,您可以使用它从现有列表/生成器创建新的列表/生成器。

假设您想生成从1到10的每个数字的平方列表。您可以在Python中执行此操作:

代码语言:javascript
复制
>>> [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函数不是生成器,因此我使用的构造是列表理解。

如果我想创建一个做同样事情的生成器,我可以这样做:

代码语言:javascript
复制
>>> (x**2 for x in xrange(1,11))
<generator object at 0x7f0a79273488>

然而,在Python3中,range是一个生成器,因此结果只取决于您使用的语法(方括号或圆括号)。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/364802

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档