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中的集合类型以及循环结构至关重要。 首先,我们来看...
Iterable对象和Iterator对象是Python中的两个基本概念,Iterable对象是可以被迭代的对象,而Iterator对象是Iterable对象的迭代器。 在Python中,Iterable对象可以通过`__iter__()`方法返回一个Iterator对象,而...
在Python编程语言中,迭代器(iterator)是一个重要的概念,它允许我们遍历任何可迭代对象,如列表、元组、字典等。迭代器提供了一种方式来逐个访问集合中的元素,而无需知道集合的大小或者实现细节。下面我们将深入...
在Python编程语言中,迭代器是一种非常重要的工具,它允许我们遍历集合中的元素,而无需显式地使用索引。迭代器具有延迟计算或惰性求值的特性,这意味着它们仅在需要时计算下一个元素,这使得处理大量数据或无限序列...
在Python编程语言中,函数是组织代码的基本单元,它们提供了重用性和模块化的特性。然而,初学者在使用函数时可能会遇到一些常见的“坑”,这些陷阱往往与局部变量作用域和迭代器的使用有关。本篇文章将深入探讨这两...
第一次写的文章 Python2.5中的迭代器与生成器
Python中的迭代器和生成器是两种非常重要的编程概念,它们在处理序列数据、节省内存以及构建高效的算法中发挥着关键作用。本文将深入探讨这两种工具的使用和解析。 1. **迭代** 迭代是Python中遍历数据结构的过程...
3. **迭代器(Iterator)**:在Python中,可以用`for`循环遍历的对象称为可迭代对象,包括列表、集合、元组、字符串和字典等。可迭代对象可以通过`isinstance(obj, Iterable)`来检查。迭代器是可迭代对象的一个实例...
8. Generator 和 Iterator:Python 中的 Generator 和 Iterator 是两种不同的迭代器。例如,问题 35 中,如何使用 Generator 来实现一个无限序列。 9. 内存管理:Python 中的内存管理是自动的,但有些情况下需要手动...
一、迭代器相关 迭代器(iterator)有时又称游标(cursor)是程序设计的软件...三、Python中的迭代器 迭代器的两个基本方法:next()、iter() 1.获取String类型的迭代器,while遍历 a, i = Baldwin, 0 it = iter(a) whi
Python中的range()函数在循环中经常使用,用于生成数字序列。此外,还有异常处理(try-except-finally)的概念,用于捕获和处理程序运行时可能出现的错误。 3. **03数据容器** 数据容器章节可能深入讲解了列表推导...
此外,书中还包含了一些高级主题,如生成器(generator)、上下文管理器(context manager)、迭代器(iterator)以及元编程(metaprogramming)等。每个知识点都配有详尽的解释和示例代码,便于读者理解和应用到...
在Python编程语言中,迭代器(Iterator)是一个非常重要的概念,它是访问集合对象(如列表、元组或字典)的元素的一种方式,特别是在处理大数据量或者需要节省内存的情况下。迭代器通过`__iter__()`和`__next__()`...
生成器(Generator)是Python中的一种迭代器(Iterator),它可以创建一个可以迭代的对象,但不会一次性将所有元素加载到内存中,而是按需生成。例如,g=((i+2)**2 for i in range(10))创建了一个生成器对象g,该...
14.5_iterator与generator|Pythonic与Python杂记|Python3.8入门_&_进阶_&_原生爬
Python是一种支持多种迭代模式的高级编程语言,其中迭代器(Iterator)和生成器(Generator)是两种非常重要的迭代机制。它们在处理数据集合时提供了不同的方法和优势。本文将深入探讨Python中的迭代器和生成器,...