Python2列表解析和生成器的关系不是很理解,python2生成器,最近在学Python2,


最近在学Python2,看到列表解析和生成器部分,感觉有些模糊。

关于什么是列表解析和生成器,以及简单的使用方法,我是知道的。
但是在使用for循环时,我就迷糊了,看下面的示例:

python>>> L[1, 2, 3]>>> for i in L:...     print i... 123>>> for i in [ k+1 for k in L ]:...     print i... 234>>> for i in ( k+1 for k in L ):...     print i... 234

主要是最后两个,for语句中in后面到底需要什么对象,上面的示例中可以是可迭代对象,还可以是迭代器,对吧?

也就是说,python中的for和c中的for并不是同一种原理?
那么python其他的一些循环语句(或者别的语句)是否也会有这种现象呢?

感觉其中应该会牵扯到迭代或者多态的思想,高手请解惑一下!

@rsj217 的答案已经说明了Python中是如何实现循环语法糖的。
我来补充一下抽象一点的东西。


Python对循环的抽象层次是高于C的。
因为Python的循环是针对可迭代对象的。可迭代对象是对物理和逻辑sequences的抽象。用面向对象的思想解释,就是可迭代对象都是满足迭代协议对象。
站在可迭代对象这个抽象层次上来编程,可以忽略具体的数据类型,比如问题中的列表和生成器。
Python有个特点就是一切皆对象,所以可以利用自省机制,使得列表和生成器这两个看起来不同的对象,都满足迭代协议从而成为可迭代对象。这也是@rsj217中的回答所说的“实现了迭代协议对象”所使用的基本思想。

另外,可迭代这个概念其实跟具体语言没有关系,这是一个逻辑上的概念。因此,Lisp中有,C++中也有,只是具体表现形式不一样。
说到Lisp,不得不提一下SICP这本书。强烈建议看一下。

你需要大致了解一下什么是迭代器或可迭代对象。具体概念就不多说了,看下面的例子

In [1]: ls = [1, 2, 3, 4]In [2]: it = iter(ls)In [3]: itOut[3]: <listiterator at 0x1010f0bd0>In [4]: try:   ...:     while True:   ...:         print it.next()   ...: except StopIteration:   ...:     pass   ...:1234In [5]: ls2 = [1, 2, 3, 4]In [6]: for i in ls2:   ...:     print i   ...:1234In [7]:

迭代器或者~~可迭代对象~~ 实现了迭代协议的对象都有一个next方法,指向迭代器的下一个元素,如果没有这抛异常。可以使用循环对迭代器操作。

for in 可以看成是这个 while 循环的语法糖

~~列表和~~生成器都是可迭代对象,实现了迭代协议的对象

编橙之家文章,

评论关闭