Python2列表解析和生成器的关系不是很理解,python2生成器,最近在学Python2,
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 循环的语法糖
~~列表和~~生成器都是可迭代对象,实现了迭代协议的对象
编橙之家文章,
相关内容
- python源码导入from django.db import models怎么理解它的意思,
- Python系统自动调用默认程序实现打开文件操作方法是
- 私信发送嵌入表情转义html标签相关安全问题求助,私信
- python提交表单并获取页面操作方法,求解答,python操作方
- python如何运行webkit核心加载页面并监控HTTP请求,pytho
- Python Flask url_for重复动态参数TypeError如何解决,flaskty
- Python编程从入门到实践第12章,外星人入侵实例中无法
- Python设置代理求助关于爬虫调用requests配置,pythonrequ
- Python gvim自动补全代码配置文件方法,pythongvim,gvim的代
- 迅雷批量下载用Python、django怎么写,pythondjango,python/
评论关闭