`
frank-liu
  • 浏览: 1684151 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

python中的iterator

 
阅读更多

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(迭代器)和Iterable(可迭代对象)是两个非常核心的概念,它们是实现数据迭代操作的基础。理解这两个概念的区别对于掌握Python中的集合类型以及循环结构至关重要。 首先,我们来看...

    14.Python中的迭代器协议1

    Iterable对象和Iterator对象是Python中的两个基本概念,Iterable对象是可以被迭代的对象,而Iterator对象是Iterable对象的迭代器。 在Python中,Iterable对象可以通过`__iter__()`方法返回一个Iterator对象,而...

    python中迭代器(iterator)用法实例分析

    在Python编程语言中,迭代器(iterator)是一个重要的概念,它允许我们遍历任何可迭代对象,如列表、元组、字典等。迭代器提供了一种方式来逐个访问集合中的元素,而无需知道集合的大小或者实现细节。下面我们将深入...

    python中实现迭代器(iterator)的方法示例

    在Python编程语言中,迭代器是一种非常重要的工具,它允许我们遍历集合中的元素,而无需显式地使用索引。迭代器具有延迟计算或惰性求值的特性,这意味着它们仅在需要时计算下一个元素,这使得处理大量数据或无限序列...

    python中函数常见坑

    在Python编程语言中,函数是组织代码的基本单元,它们提供了重用性和模块化的特性。然而,初学者在使用函数时可能会遇到一些常见的“坑”,这些陷阱往往与局部变量作用域和迭代器的使用有关。本篇文章将深入探讨这两...

    Python2.5中的迭代器与生成器(自己写的)

    第一次写的文章 Python2.5中的迭代器与生成器

    Python迭代器iterator生成器generator使用解析

    Python中的迭代器和生成器是两种非常重要的编程概念,它们在处理序列数据、节省内存以及构建高效的算法中发挥着关键作用。本文将深入探讨这两种工具的使用和解析。 1. **迭代** 迭代是Python中遍历数据结构的过程...

    Python 八股文.pdf

    3. **迭代器(Iterator)**:在Python中,可以用`for`循环遍历的对象称为可迭代对象,包括列表、集合、元组、字符串和字典等。可迭代对象可以通过`isinstance(obj, Iterable)`来检查。迭代器是可迭代对象的一个实例...

    Python面试大全.pdf

    8. Generator 和 Iterator:Python 中的 Generator 和 Iterator 是两种不同的迭代器。例如,问题 35 中,如何使用 Generator 来实现一个无限序列。 9. 内存管理:Python 中的内存管理是自动的,但有些情况下需要手动...

    Python进阶教程 Python各知识领域高级操作教程 进阶操作教程 共26个章节 共103页.pdf

    2. **调试(Debugging)**:调试是开发过程中的重要环节,教程中可能涵盖了如何使用断点、日志记录以及Python内置的`pdb`调试工具等方法。 3. **生成器(Generators)**:生成器是一种特殊的迭代器,允许你在运行时动态...

    Python学习笔记(五)——–Python迭代器

    一、迭代器相关 迭代器(iterator)有时又称游标(cursor)是程序设计的软件...三、Python中的迭代器 迭代器的两个基本方法:next()、iter() 1.获取String类型的迭代器,while遍历 a, i = Baldwin, 0 it = iter(a) whi

    python基础课程学习资料.zip

    Python中的range()函数在循环中经常使用,用于生成数字序列。此外,还有异常处理(try-except-finally)的概念,用于捕获和处理程序运行时可能出现的错误。 3. **03数据容器** 数据容器章节可能深入讲解了列表推导...

    python-cookbook 3

    此外,书中还包含了一些高级主题,如生成器(generator)、上下文管理器(context manager)、迭代器(iterator)以及元编程(metaprogramming)等。每个知识点都配有详尽的解释和示例代码,便于读者理解和应用到...

    Python 迭代器 iteraor

    在Python编程语言中,迭代器(Iterator)是一个非常重要的概念,它是访问集合对象(如列表、元组或字典)的元素的一种方式,特别是在处理大数据量或者需要节省内存的情况下。迭代器通过`__iter__()`和`__next__()`...

    实验7 Python组合数据类型.pdf

    生成器(Generator)是Python中的一种迭代器(Iterator),它可以创建一个可以迭代的对象,但不会一次性将所有元素加载到内存中,而是按需生成。例如,g=((i+2)**2 for i in range(10))创建了一个生成器对象g,该...

    14.5 iterator与generator|Pythonic与Python杂记|Python3.8入门 & 进阶 & 原生爬虫实战完全解读

    14.5_iterator与generator|Pythonic与Python杂记|Python3.8入门_&_进阶_&_原生爬

Global site tag (gtag.js) - Google Analytics