生成器理解有什么作用?它是如何工作的?我找不到关于它的教程.
你了解列表理解吗?如果是这样,生成器表达式就像列表推导,但不是找到您感兴趣的所有项目并将它们打包到列表中,而是等待,并逐个从表达式中生成每个项目.
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()方法的对象将产生下一个元素.
如果您不熟悉列表推导,请参见此处和生成器,请参见此处.