总结一下python的迭代。

sentence类第一版

import re
import reprlib

RE_WORD = re.compile('\w+')

class Sentence:
    def __init__(self, text):
        self.text = text
        self.words = RE_WORD.findall(text)

    def __getitem__(self, index):
        return self.words[index]

    def __len__(self):
        return len(self.words)

    def __repr__(self):
        return 'Sentence(%s)' % reprlib.repr(self.text)
  1. re.findall函数返回一个字符串列表,里面的元素是正则表达式的全部非重叠匹配。
  2. reprlib.repr函数用来表示一个缩略形式。

测试:

>>> s = Sentence('"The time has come," the Walrus said,')
>>> s
Sentence('"The time ha... Walrus said,"')
>>> for word in s:
        print(word)
The
time
...

>>> list(s)
['The', 'time', 'has', 'come', 'the', 'Walrus', 'said']

序列可以迭代的原因:iter函数

“解释器需要迭代对象x时,会自动调用iter(x).” 内置的iter函数有以下作用:

  1. 检查对象是否实现了__iter__方法,如果实现了就调用它,获取一个迭代器。
  2. 如果没有实现__iter__方法,但是实现了__getitem__方法,python会创建一个迭代器,尝试从索引0开始获取元素。
  3. 如果尝试失败,python会抛出typeError异常。

可迭代对象与迭代器的对比

可迭代对象: 使用iter内置函数可以获取迭代器对象。如果对象实现了能返回迭代器的__iter__方法,那么对象就是可迭代的。 “python从可迭代对象中获取迭代器。” 看下面的例子:

>>> s = 'ABC'
>>> it = iter(s)
>>> while True:
        try:
            print(next(it))
        except StopIteration:
            del it
            break
A
B
C

标准的迭代器接口有两个方法:
__next__ 返回下一个可用的元素,如果没有元素了,抛出stopiteration异常。 __iter__ 返回self,以便在应该使用可迭代对象的地方使用迭代器。

迭代器: 实现了无参数的__next__方法,返回序列中的下一个元素;如果没有元素了,抛出StopIteration异常。python中的迭代器还实现了__iter__方法,因此迭代器也可以迭代。