Displaying posts tagged with

“iterators”

iterators, iterables, generators

原文作者:Mark Mruss 中文翻译:Tony(digitalsatori) 原文出处:http://www.learningpython.com 简介 在本文中我们将讨论Python语言中三个相关的概念:iterators, iterables 和 generators。(译者注4 ) Generators的概念很容易了解。它们是创建和返回iterator的函数。而iterator和iterables就用起来容易说起来难了。iterable对象是”可以一次返回其一个成员的容器对象1 iterator 对象表示一个数据流,当重复的调用iterator 的next()方法时,其将顺序返回数据流上的数据。当没有数据时返回一个StopIteration 异常。此时iterator 对象已被穷尽,任何对next()的继续调用,都只会导致返回StopIteration 异常。2 你可以这样来理解这两个概念之间的差别:iterable 对象可以被遍历多次,而iterator 对象只能遍历一次。总之,当每次需要遍历iterable 的数据时,iterable 创建一个iterator 对象。 注: 定义了__getitem__函数的类也可以被认为是iterables,但是这个内容不在本文讨论范围之内。 本文中我们首先讨论iterators及其最基本的概念。然后是generators, 最后我们讨论3个概念中最为宽泛的话题,iterables。 Python中的遍历操作 在Python中我们使用Iterators对象来遍历对象中的数据。例如,我们都知道如何来遍历list中的数据: my_list = [1,2,3] for num in my_list: print num 上面的代码会遍历list对象my_list,然后打印出其中所有的对象,即,1,2,3。 用这种简单透明的方法对一个序列(sequences)作遍历操作是我喜欢Python的原因之一。 根据上面的定义,list是iterables,因为你可以对它作多次的遍历操作。事实上,每次对list作遍历操作时,我们实际上用到的是list创建的listiterator这个iterator对象。 你可能还不清楚什么时候应该给一个类增加遍历支持。可是,随着你更多的接触Python, 你会发现这样的设计非常有帮助,它的一个明显的好处是代码更加清晰。使用iterators 和 generators的一个好处是,只在需要时处理每个成员对象。它不是获取所有的数据并放到一个list中,然后遍历这个list,而是在你需要使用时,才去获取每个数据。乍看起来这好象没太大的区别但是请设想如果成员数据有成千上万之多呢?或者你要获取的数据来自网络呢?一次性处理所有的数据会花费很多的时间,特别当你需要的只是开头的几个数据就更划不来了。 第一个例子 为了更深入的了解遍历操作,我们来看一个可能用到iterators的简单例子。在这个例子中我们会创建一个类,这个类接受字符串然后将每个字符转换为ASCII字节码。如果我们不用iterators,这个程序会如: Listing 1 所示: Listing 1: class ByteValue(object): def [...]