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

生成器理解有什么作用?它是如何工作的?我找不到关于它的教程.
最佳答案
你了解列表理解吗?如果是这样,生成器表达式就像列表推导,但不是找到您感兴趣的所有项目并将它们打包到列表中,而是等待,并逐个从表达式中生成每个项目.

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
<generator object at 0xb7d5e02c>
>>> 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.
... 
>>> 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 "<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
>>> 

python3版本:

将next()更改为__next __()

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

转载注明原文:python – 生成器理解究竟是如何工作的? - 代码日志