python笔记十(列表生成式生成器)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python笔记十(列表生成式生成器)相关的知识,希望对你有一定的参考价值。

一、列表生成式

  列表生成式就是python设置的可以用来可以生成列表的

  如要生成一个0-9的列表我们可以通过以下代码实现:

>>> list(range(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

  但是如果生成的列表较为复杂呢?例如生成包含02、12、22。。。92这样一个列表;

>>> L = []
>>> for i in range(10):
...     L.append(i*i)
...
>>> L
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

  在上述代码中,我们通过for循环将数值append到列表L中,虽然可以实现,但是也是low爆了~~~,以下通过一行代码搞定!!!

>>> [i*i for i in range(10)]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

  除此之外,列表生成式还可以生成更为复杂的列表。通过列表生成式可以快速生成格式化的列表。

>>> d ={"name":"nadech","age":"22","address":"NANJING"}
>>> [key+"="+value for key,value in d.items()]
[name=nadech, age=22, address=NANJING]

 

二、生成器

  通过列表生成式,我们可以直接创建一个列表的所有元素。

  但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。

  如果列表可以按照需求,一边循环一边计算,就可以解决上述问题。这种机制就叫做生成器(generator)。

  生成器共有两种形式,第一种就是把列表生成式中的[ ]改为( );第二种就是含有yield

>>> g = (i*i for i in range(1,3))
>>> next(g)
1
>>> next(g)
4
>>> next(g)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

 >>> (i*i for i in range(10))
 <generator object <genexpr> at 0x0000029EA41490F8>

 

 >>> for i in g:
 ... print(i)
 ...
 1
 4

 

  上述代码加粗部分可以看出,创建生成器返回的是一个生成器对象的地址,并不是直接包含所有的元素的列表。

  通过调用next,可以生成下个元素的值,不过在实际使用中我们并不会通过多次调用next,而是通过for循环来获取生成器的元素。

 

  第二种我们要介绍的就是包含yield的,

  








以上是关于python笔记十(列表生成式生成器)的主要内容,如果未能解决你的问题,请参考以下文章

Python之第十五天的努力--生成器,列表推导式,生成器表达式,内置函数1(了解)

python入门第十六天__列表生成式

python学习第十二天,生成器,列表推导式

Python学习笔记 列表生成式_生成器

十python生成器和迭代器

python学习笔记——列表生成式与生成器