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:
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,运行一下,程序走一步。