Python迭代器

2019-06-22  本文已影响0人  Recalcitrant

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))
运行结果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)
运行结果2

三、生成器

yield关键字

示例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))
运行结果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
上一篇 下一篇

猜你喜欢

热点阅读