Python迭代器
一、可迭代对象
判定对象是否为可迭代对象
- 1.检查对象x是否实现了__iter__()方法,如果实现了该方法就调用它,并尝试获取一个迭代器。
- 2.如果没有实现__iter__()方法,但是实现了__getitem__(index)方法,尝试按顺序(从索引0开始)获取元素,即参数index是从0开始的整数(int)。之所以会检查是否实现__getitem(index)__方法,为了向后兼容。
- 3.如果前面都尝试失败,Python会抛出TypeError异常,通常会提示'X' object is not iterable(X类型的对象不可迭代),其中X是目标对象所属的类。
二、迭代器
迭代器 规定了两个方法:
- __iter__:返回迭代器本身
- __next__:返回下一个元素
读取完毕之后,再调用next()会触发StopIteration异常。
示例1:
it = iter("abcdef")
print(next(it))
print(next(it))
print(next(it))
print(next(it))
print(next(it))
print(next(it))
示例2:
class SentenceIter:
def __init__(self, text):
self.text = text
self.words = self.text.split()
self.step = -1
def __iter__(self):
return self
def __next__(self):
if self.step >= len(self.words) - 1:
raise StopIteration
self.step += 1
return self.words[self.step]
ss = SentenceIter("This is an apple.")
for word in ss:
print(word)
三、生成器
yield关键字
- yield 的作用是把一个函数变成一个 generator,带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator。
- 程序执行到yield关键字处会停住,并返回yield后的值,再次调用next()会从上次中断处继续执行。若函数已执行完毕仍再次调用next(),则会抛出StopIteration异常。
示例1:斐波那契数列生成器
def fibonacci_generator():
a, b = 1, 1
while True:
yield a
a, b = b, a + b
f = fibonacci_generator()
print(f)
print(next(f))
print(next(f))
print(next(f))
print(next(f))
print(next(f))
print(next(f))
示例2:
def generator_123():
yield 1
yield 2
yield 3
g = generator_123()
print(g)
print(next(g))
print(next(g))
print(next(g))