在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__函数
代码:
运行结果:
分析:
1.1)在pycharm中会显示Fab(6)(属性)异常:颜色显示
1.2)运行结果显示Fab类对象不可迭代。
2)注销__next__()函数(或改为其他名称)
代码:
运行结果:
分析:
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
讲的很详细。