python : 自定义可迭代类,__iter__ ,__next__的作用

在python3中,如果定义了一个类,类中有 __iter__(self),__next__(self)两个函数,则该类具有了迭代器的属性,

具体性质体现在:

        如果该类的对象出现在一个for循环中,那么for循环会自动通过__iter__标志识别这是一个可迭代的类,继而自动调用__next__()函数

示例:

class Fab(object):
    def __init__(self,max,):
        self.max=max
        self.n,self.a,self.b=0,0,1
    def __iter__(self):
        return self
    def __next__(self):
        if self.n < self.max:
            out = self.b
            self.a,self.b=self.b,self.a+self.b
            self.n = self.n+1
            return out
        raise StopIteration()
    
for i in Fab(6):
    print(i)

返回结果:

1
1
2
3
5
8

测试:

1)注销__iter__函数

代码:

python : 自定义可迭代类,__iter__ ,__next__的作用_第1张图片

运行结果:

    分析:

    1.1)在pycharm中会显示Fab(6)(属性)异常:颜色显示

    1.2)运行结果显示Fab类对象不可迭代。

 

2)注销__next__()函数(或改为其他名称)

代码:

python : 自定义可迭代类,__iter__ ,__next__的作用_第2张图片

运行结果:

分析:

2.1)pycharm中没有显示Fab(6)(属性)异常:没有异常的颜色标注

2.2)运行结果显示Fab没有迭代器。

 

总结:

1)通过在类中添加 __iter__函数,向系统说明这是一个可迭代对象。

2)通过在类中添加 __next__函数,向系统提供该可迭代对象的迭代算法

3)在代码执行过程中,for循环函数会自动检查系统信息,识别__iter__函数,然后自动调用对应的__next__函数,生成一个迭代器。

4)所以在定义一个可迭代类时,一般__iter__ 函数要与 __next__函数成对出现。__iter__函数向系统声明这个类可迭代,__next__定义了具体的迭代器。

5)__iter__ 与 __next__两个函数名不可改变,否则系统会不识别。

6)__next__函数的 return 在 if 判别命令的内部,每次执行__next__函数时,单次判别后直接输出。不满足判别条件时输出迭代终止。

####################################################################################

以下引自:https://www.liaoxuefeng.com/wiki/1016959663602400/1017323698112640#0 的评论区

**************************************

python_迭代器协议

一、定义

  1、迭代器协议是指:对象必须提供一个next方法,执行方法要么返回迭代器中的下一项,要么就引起一个StopIteration异常,以终止迭代(单向运行:只能前进,不能倒退);

  2、可迭代对象:实现了迭代器协议的对象(实现方式:对象内部定义了一个iter()方法);

  3、协议是一种约定,可迭代对象实现了迭代器协议,Python的内部工具(如for循环,sum,min,max函数等)使用迭代器协议访问对象。

二、迭代器协议的实现

  迭代器协议规定了对象必须提供一个next方法和iter方法。

  正式的说法是:实现了__iter__方法的对象是可迭代对象,实现了__next__方法的对象是迭代器。

***************************************

#############################################################################################

以下是JavaScript中对迭代器的介绍,引用自:http://caibaojian.com/es6/iterator.html

什么是迭代器/遍历器(Iterator)?

遍历器(Iterator)就是这样一种机制。它是一种接口,为各种不同的数据结构提供统一的访问机制。任何数据结构只要部署Iterator接口,就可以完成遍历操作(即依次处理该数据结构的所有成员)。

Iterator的作用有三个:一是为各种数据结构,提供一个统一的、简便的访问接口;二是使得数据结构的成员能够按某种次序排列;三是ES6创造了一种新的遍历命令for...of循环,Iterator接口主要供for...of消费。

Iterator的遍历过程是这样的。

(1)创建一个指针对象,指向当前数据结构的起始位置。也就是说,遍历器对象本质上,就是一个指针对象。

(2)第一次调用指针对象的next方法,可以将指针指向数据结构的第一个成员。

(3)第二次调用指针对象的next方法,指针就指向数据结构的第二个成员。

(4)不断调用指针对象的next方法,直到它指向数据结构的结束位置。

######################################################################################

以下是廖雪峰老师讲解的迭代器,网址:https://www.liaoxuefeng.com/wiki/1016959663602400/1017323698112640

讲的很详细。

 

 

你可能感兴趣的:(Python)