当前位置:  开发笔记 > 编程语言 > 正文

生成器理解究竟是如何工作的?

如何解决《生成器理解究竟是如何工作的?》经验,为你挑选了2个好方法。

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



1> gotgenes..:

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

python2版本:

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

>>> len(filtered_gen) # So technically, it has no length
Traceback (most recent call last):
  File "", line 1, in 
TypeError: object of type 'generator' has no len()
>>> # We extract each item out individually. We'll do it manually first.
... 
>>> filtered_gen.next()
5
>>> filtered_gen.next()
9
>>> filtered_gen.next()
6
>>> filtered_gen.next() # Should be all out of items and give an error
Traceback (most recent call last):
  File "", line 1, in 
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
>>> 

python3版本:

改变next()__next__()

因为生成器表达式一次只需要生成一个项目,所以可以大大节省内存使用量.在需要一次取一个项目,根据该项目进行大量计算,然后转到下一个项目的情况下,生成器表达式最有意义.如果您需要多个值,您还可以使用生成器表达式并一次抓取一些.如果在程序进行之前需要所有值,请改用列表推导.


这里有一个问题.我使用next(gen_name)来获得结果,它在Python 3中工作.是否有任何特定场景我们需要使用__next __()?
@AnkitVashistha不,在Python 3中总是使用`next(...)`而不是`.__ next __()`.

2> rz...:

生成器理解是列表理解的惰性版本.

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

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

推荐阅读
罗文彬2502852027
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有