首页 > 关于python中列表解析和生成器的关系,以for为例?

关于python中列表解析和生成器的关系,以for为例?

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

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

python>>> L
[1, 2, 3]

>>> for i in L:
...     print i
... 
1
2
3

>>> for i in [ k+1 for k in L ]:
...     print i
... 
2
3
4

>>> for i in ( k+1 for k in L ):
...     print i
... 
2
3
4

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

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

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


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

In [1]: ls = [1, 2, 3, 4]

In [2]: it = iter(ls)

In [3]: it
Out[3]: <listiterator at 0x1010f0bd0>

In [4]: try:
   ...:     while True:
   ...:         print it.next()
   ...: except StopIteration:
   ...:     pass
   ...:
1
2
3
4

In [5]: ls2 = [1, 2, 3, 4]

In [6]: for i in ls2:
   ...:     print i
   ...:
1
2
3
4

In [7]:

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

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

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


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


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

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

【热门文章】
【热门文章】