总结一下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)
- re.findall函数返回一个字符串列表,里面的元素是正则表达式的全部非重叠匹配。
- 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函数有以下作用:
- 检查对象是否实现了__iter__方法,如果实现了就调用它,获取一个迭代器。
- 如果没有实现__iter__方法,但是实现了__getitem__方法,python会创建一个迭代器,尝试从索引0开始获取元素。
- 如果尝试失败,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__方法,因此迭代器也可以迭代。