Iterator
在python中我们常用到for语句,比较常见的有如:
for x in rang(5):
print x,
返回的结果如下:
0 1 2 3 4
for语句可以使用的场景往往不仅仅局限于list中,还可以用到其他的地方,比如在Dict和一些字符串中间都可以遍历:
# iterate through dict
pc={"name":"mypc", "port": 80}
for key in pc:
print key,
# result
'name' 'port'
# iterate through string
s = "You!"
for c in s:
print c,
# result
Y o u !
和很多静态编译语言,如java的思想类似,我们需要能够遍历一个对象,那么这个对象应该遵守某种规则,使得它可被遍历。在java中间是通过iterator pattern的手法,实现iterable接口。python中间要能够遍历一个对象,那么这个对象就必须是iterable的。只是不需要专门实现一个接口。
Iteration协议:
前面说到,既然我们要能够迭代访问某个对象,需要对象是iterable的。那么我们先看看一个可以迭代对象表现的特征:
items = [1, 2, 3]
it = iter(items)
it.next()
1
it.next()
2
it.next()
3
it.next()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
和java中的for循环类似,python中当对一个对象进行for循环的时候,比如如下的代码:
for x in obj:
# statements
底层对应生成的的代码形式如下:
_iter_ = obj.__iter__()
while 1:
try:
x = _iter.next()
except StopIteration:
break
# statements
我们从前面遍历一个数组的过程中可以看到,终止一个循环的条件是StopIteration的异常。
实现Iteration协议:
现在,假定我们自己要定义一个可以遍历的对象,那么按照前面讨论的协议过程,代码需要实现两个方法,一个是__iter__,一个是next。比如我们有如下的代码:
class CountDown:
def __init__(self, start):
self.count = start
def __iter__(self):
return self
def next(self):
if self.count <= 0:
raise StopIteration
r = self.count
self.count -= 1
return r
这是一个典型的实现iteration协议的代码。主要从指定的一个数字倒序返回到0.我们遍历这个对象的代码如下:
for x in CountDown(5):
print x,
#result
5 4 3 2 1
总结:
从整个过程看来,使得一个对象可以被遍历无非就是自己定义实现__iter__和next两个方法。
__iter__方法返回一个iterator,类似于java中间实现iterable接口而需要返回一个Iterator。而next方法则是返回具体下一个元素。当把两个方法放在一个类里头的时候,相当于把实现两个接口的东西糅合在一起了。Python里面没有专门接口的定义,这样拼凑过来就可以了。当然,在实际情况下也可以将两者拆分,像java中间那样,类似于两个专职的功能的类。比如说前面示例,拆开了写的形式如下:
class countdown(object):
def __init__(self, start):
self.count = start
def __iter__(self):
return countdown_iter(self.count)
class countdown_iter(object):
def __init__(self, count):
self.count = count
def next(self):
if self.count <= 0:
raise StopIteration
r = self.count
self.count -= 1
return r
参考链接:
http://www.slideshare.net/dabeaz/python-generator-hacking
分享到:
相关推荐
今天小编就为大家分享一篇对Python中Iterator和Iterable的区别详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
主要介绍了python中迭代器(iterator)用法,实例分析了Python中迭代器的相关使用技巧,非常具有实用价值,需要的朋友可以参考下
我们经常需要遍历一个对象中的元素,在Python中这种功能是通过迭代器来实现的。下面这篇文章主要给大家介绍了python中实现迭代器(iterator)的方法示例,需要的朋友可以参考借鉴,下面来一起看看吧。
什么是Python中的迭代器(Iterator)和可迭代对象(Iterable)? Python中如何处理异常(Exception)?列举一些常见的异常类型。 什么是Python中的命名空间(Namespace)和作用域(Scope)? Python中的深拷贝和...
第一次写的文章 Python2.5中的迭代器与生成器
主要介绍了Python迭代器iterator生成器generator使用解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
一、迭代器相关 迭代器(iterator)有时又称游标(cursor)是程序设计的软件...三、Python中的迭代器 迭代器的两个基本方法:next()、iter() 1.获取String类型的迭代器,while遍历 a, i = Baldwin, 0 it = iter(a) whi
请谈谈 Python 中的生成器(Generator)和迭代器(Iterator)的区别以及如何使用。 - 5. 什么是 Python 的模块(Module)和包(Package)?请说明模块和包在 Python 中的作用和组织方式。 - 6. 请解释一下 Python ...
14.5_iterator与generator|Pythonic与Python杂记|Python3.8入门_&_进阶_&_原生爬
博客配套文件,详细演示了局部变量作用域问题和迭代器反复调用问题,并给出了对应解决办法,供参考。
需要在Delphi中先安装上PythonForDelphi控件包,安装不麻烦,可参考上述资料的说明文档. 包含34个例程源码几乎涵盖了Python4Delphi的所有方面. Demo01 A simple Python evaluator Demo02 Evaluate a Python expression...
PEP 471 - os.scandir() function – a better and faster directory iterator PEP 475: Retry system calls failing with EINTR PEP 479: Change StopIteration handling inside generators PEP 485: A function...
主要给大家介绍了如何通过一篇文章彻底搞懂Python中可迭代(Iterable)、迭代器(Iterator)与生成器(Generator)的概念,对大家学习或者使用Python具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
这些文件其实在boost的目录下面和C:\Python27\include目录中. 为了使用方便,将整个\boost_1_49_0\boost\目录复制到MinGw的include目录下面; 将C:\Python27\include目录下的文件全部复制到MinGw的include目录下面...
23种Python设计模式示例演示源码包,比如包括了工厂模式、Bridge桥接模式、Builder构建模式、Facade外观模式、Adapter适配器模式,Composite组合模式、Decorator装饰器模式,FactoryMethod工厂方法模式、Flyweight享...