0%

可迭代对象、迭代器和生成器

总结一下python的迭代。

sentence类第一版

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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函数用来表示一个缩略形式。

测试:

1
2
3
4
5
6
7
8
9
10
11
>>> 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从可迭代对象中获取迭代器。”
看下面的例子:

1
2
3
4
5
6
7
8
9
10
11
>>> 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方法,因此迭代器也可以迭代。