列表推导式产生的列表和生成器推导式产生的生成器有什么区别
    1.列表推导式会直接形成一个新的列表,一次性地把列表中的所有数据都放入内存中,如果列表元素非常多,会占用很大的内存孔继子女,生成器只是生成器推导式指定的算法,当访问生成器的时候才产生具体的元素,而不是一次性生成所有元素,所以生成器只占用很小的内存空间
    2.列表推导式生成的列表中的元素可以多次访问,生成器推导式产生的生成器中的元素只能从前向后一个元素一个元素地访问,访问后就会消失。

    1. g = (x ** 2 for x in range(1,10))
    2. print(next(g))
    3. tuple1=tuple(g)
    4. print(tuple1)
    5. ##结果
    6. 1
    7. (4, 9, 16, 25, 36, 49, 64, 81)

    可以看到,用next函数访问了生成器产生的第一个元素之后,生成器g转化成元组的时候,只能转化生成器中未被访问的元素

    1. g = (x ** 2 for x in range(1,10))
    2. tuple1=tuple(g)
    3. print(tuple1)
    4. print(next(g))
    5. ##结果
    6. Traceback (most recent call last):
    7. (1, 4, 9, 16, 25, 36, 49, 64, 81)
    8. File "D:/pythontest/geshu.py", line 112, in <module>
    9. print(next(g))
    10. StopIteration

    生成器g转换成元组之后,就相当于被使用过一次了,就会被释放,如果需要再次使用,只能使用生成器推导式重新生成。