生成器理解如何工作?

2024-12-20 08:37:00
admin
原创
66
摘要:问题描述:生成器理解有什么用?它是如何工作的?我找不到关于它的教程。解决方案 1:你理解列表推导式吗?如果理解的话,生成器表达式就像列表推导式,但它不会找到你感兴趣的所有项并将它们打包到列表中,而是等待,然后逐一从表达式中生成每个项。>>> my_list = [1, 3, 5, 9, 2,...

问题描述:

生成器理解有什么用?它是如何工作的?我找不到关于它的教程。


解决方案 1:

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

>>> 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
>>> 

由于生成器表达式每次只需生成一个项,因此可以大大节省内存使用量。在需要每次获取一个项、基于该项进行大量计算,然后转到下一个项的情况下,生成器表达式最有意义。如果需要多个值,也可以使用生成器表达式并一次获取几个值。如果在程序继续运行之前需要所有值,请改用列表推导式。

解决方案 2:

生成器推导是列表推导的惰性版本。

它就像一个列表推导,只是它返回一个迭代器而不是列表,即一个具有 next() 方法的对象,它将产生下一个元素。

如果您不熟悉列表推导,请参见此处;如果您不熟悉生成器,请参见此处。

解决方案 3:

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

假设你想要生成从 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],但是该range函数在 Python 3.0 之前不是生成器,因此我使用的构造是列表推导式。

如果我想创建一个执行相同操作的生成器,我可以这样做:

>>> (x**2 for x in xrange(1,11))
<generator object at 0x7f0a79273488>

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

解决方案 4:

生成器理解是一种创建具有特定结构的生成器的简单方法。假设您想要一个generator逐个输出 中的所有偶数your_list。如果您使用函数样式创建它,它将如下所示:

def allEvens( L ):
    for number in L:
        if number % 2 is 0:
            yield number

evens = allEvens( yourList )

你可以用这个生成器理解表达式获得相同的结果:

evens = ( number for number in your_list if number % 2 == 0 )

在这两种情况下,当您调用时,next(evens)您会得到下一个偶数your_list

解决方案 5:

生成器理解是一种创建可迭代对象的方法,类似于在资源上移动的游标。如果您了解 mysql 游标或 mongodb 游标,您可能知道整个实际数据永远不会一次加载到内存中,而是一次加载一个。您的游标来回移动,但内存中始终有一个行/列表元素。

简而言之,通过使用生成器理解,您可以轻松地在 Python 中创建游标。

解决方案 6:

生成器理解的另一个例子:

print 'Generator comprehensions'

def sq_num(n):
    for num in (x**2 for x in range(n)):    
        yield num

for x in sq_num(10):
    print x 

解决方案 7:

生成器与列表完全相同,细微的差别在于,在列表中,我们一次获得列表中所有需要的数字或项目,但在生成器中,需要的数字是一次产生一个。因此,为了获得所需的项目,我们必须使用 for 循环来获取所有需要的项目。

#to get all the even numbers in given range
 
def allevens(n):
    for x in range(2,n):
        if x%2==0:
            yield x

for x in allevens(10)
print(x)

#output
2
4
6
8

解决方案 8:

我们可以将其理解为列表推导的生成器版本。在列表推导的情况下,我们使用单行代码或短代码创建,而对于生成器推导,我们为生成器编写单行代码或小代码。它们具有相同的语法,只需将 [](方括号)替换为 () 花括号即可。

generator_composition_object = (num**3 for num in range(5))
print(generator_composition_object)

这将给出类型生成器对象的地址。我们还可以在此使用 next() 之类的功能。

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1006  
  华为作为全球领先的科技公司,其成功的关键之一在于其高效的研发管理体系——集成产品开发(IPD)。IPD不仅仅是一套流程工具,更是一种团队协作与文化融合的实践体系。通过IPD,华为将跨部门的资源、能力和智慧有效整合,实现了从产品概念到市场交付的全流程高效运作。IPD的核心在于打破传统职能部门的壁垒,强调团队协作与文化的深...
IPD集成产品开发流程   0  
  创新是企业持续发展的核心驱动力,而集成产品开发(IPD, Integrated Product Development)作为一种先进的管理方法,能够帮助企业实现从产品概念到市场落地的全流程优化。通过系统化的流程设计和跨职能团队的协同合作,IPD不仅能够提升开发效率,还能显著降低风险,确保产品在市场上具备竞争力。许多企业...
华为IPD流程   0  
  在快速变化的市场中,企业面临着缩短产品上市时间的巨大压力。消费者需求的多样化和技术的迅猛发展,使得产品生命周期日益缩短。企业必须更快地推出新产品,以抢占市场先机并满足客户期望。然而,传统的产品开发流程往往效率低下,难以应对这种挑战。集成产品开发(IPD)流程作为一种系统化的产品开发方法,能够帮助企业在确保质量的同时,显...
IPD培训课程   0  
  研发IPD(Integrated Product Development,集成产品开发)流程是企业实现高效产品开发的核心方法论之一。它通过跨部门协作、并行工程和结构化流程,确保产品从概念到市场的高效交付。然而,在IPD流程中,绩效评估与改进方法的设计与实施往往成为企业面临的重大挑战。由于研发活动的复杂性和不确定性,传统...
IPD流程分为几个阶段   0  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用