Python迭代器

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))
Python迭代器_第1张图片
运行结果1

示例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)
Python迭代器_第2张图片
运行结果2

三、生成器

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))
Python迭代器_第3张图片
运行结果1

示例2:

def generator_123():
    yield 1
    yield 2
    yield 3


g = generator_123()
print(g)
print(next(g))
print(next(g))
print(next(g))
运行结果2

你可能感兴趣的:(Python迭代器)