python学习35:列表生成器的简单使用

前文(列表生成式,缩短代码的行数)说到列表生成式,这篇说一下列表生成器(generator)。

生成式和生成器的表面区别只是一个[ ],一个()。写C语言的都会非常注意内存问题,生成器的出现也是因为内存问题,生成式弄出来的列表,如果元素比较多,会占用非常大的一块内存,但是有时可能只用前几个元素,那就造成内存的浪费,此时生成器出现了,用多少元素,就给你生成多少元素出来

代码1:只是简单介绍一下生成器与生成式的区别。

代码2:采用斐波那契数列,就可以很好的体会到生成器的好处。

代码1:

list1 = [x*x for x in range(10)]
print('list1=',list1)

gen1 = (x*x for x in range(10))
print('gen1=',gen1)

 采用next()获取生成器的值,如下,但是感觉一次次的next有点麻烦,所以可以使用for循环。

=================== RESTART: C:\Users\公有制\Desktop\test1.py ===================
list1= [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
gen1= <generator object <genexpr> at 0x0000016490383B88>
>>> next(gen1)
0
>>> print(gen1)
<generator object <genexpr> at 0x0000016490383B88>
>>> next(gen1)
1
>>> next(gen1)
4
>>> next(gen1)
9
>>> next(gen1)
16
>>> next(gen1)
25
>>> next(gen1)
36
>>> next(gen1)
49
>>> next(gen1)
64
>>> next(gen1)
81
>>> next(gen1)
Traceback (most recent call last):
  File "<pyshell#37>", line 1, in <module>
    next(gen1)
StopIteration

for改进:

list1 = [x*x for x in range(10)]
print('list1=',list1)

gen1 = (x*x for x in range(10))
print('gen1=',gen1)

for i in gen1:
    print(i)

结果:

=================== RESTART: C:\Users\公有制\Desktop\test1.py ===================
list1= [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
gen1= <generator object <genexpr> at 0x000001697C553C00>
0
1
4
9
16
25
36
49
64
81
>>> 

代码2:

python学习35:列表生成器的简单使用

 fbi1的运行结果:

=================== RESTART: C:\Users\公有制\Desktop\test1.py ===================
1
1
2
3
5
8
13
21
34
55
>>> 

fbi2运行的结果:

=================== RESTART: C:\Users\公有制\Desktop\test1.py ===================
<generator object fib2 at 0x000001ABD81A3B88>
1
1
2
3
5
8

很明显可以,没有使用yield关键字的时候,菲波那切数列是全部打印出来的。

这让我想起了gdb调试的next,运行一下,程序走一步。