迭代器

1、可迭代对象:我们把可以通过for...in...这类语句迭代读取一条数据供我们使用的对象称之为可迭代对象(Iterable)

from collections.abc import Iterable
print(isinstance(判断对象,Iterable))  #返回True,说明是可迭代对象,False不是 
isinstance() 判断一个对象是否是 Iterable 对象

一个具备了__iter__方法的对象,就是一个可迭代对象

from collections.abc import Iterable

class Mylist(object):
    def __init__(self):
        self.container = []

    def add(self,item):
        self.container.append(item)
    def __iter__(self):
        """返回一个迭代器"""
        pass
mylist = Mylist()
print(isinstance(mylist, Iterable))
View Code

 

2、iiter()函数与nex()函数

list、tuple等都是可迭代对象,我们可以通过iter()函数获取这些可迭代对象的迭代器。然后我们可以对获取到的迭代器不断使用next()函数来获取下一条数据。iter()函数实际上就是调用了可迭代对象的__iter__方法。

3、迭代器

判断一个对象是否是迭代器

 

当我们对迭代器使用next()函数的时候,迭代器会向我们返回它所记录位置的下一个位置的数据。实际上,在使用next()函数的时候,调用的就是迭代器对象的__next__方法(Python3中是对象的__next__方法,Python2中是对象的next()方法)。所以,我们要想构造一个迭代器,就要实现它的__next__方法。但这还不够,python要求迭代器本身也是可迭代的,所以我们还要为迭代器实现__iter__方法,而__iter__方法要返回一个迭代器,迭代器自身正是一个迭代器,所以迭代器的__iter__方法返回自身即可

一个实现了__iter__方法和__next__方法的对象,就是迭代器:

示例:

class Fibonacci(object):
    """斐波那契数列迭代器"""
    def __init__(self,n):
        self.n = n
        self.second = 0  #  保存当前生成数列中的第几个数
        self .num1 = 0    #  设置初始值
        self.num2 = 1

    def __iter__(self):
        return self

    def __next__(self):

        if self.second < self.n:
            num = self.num1
            self.num1,self.num2 = self.num2,self.num1+self.num2
            self.second += 1
            return num
        else:
            raise StopIteration

if __name__ == '__main__':
    fi = Fibonacci(10)
    for i in fi:
         print(i)
斐波那契数列迭代器

 

posted @ 2019-03-11 18:54  chengzhengdong  阅读(97)  评论(0编辑  收藏  举报