获取更多python小知识,欢迎订阅本专栏.
iterator (迭代器) 的定义
大雄要做数学作业,算前100个斐波那契数填空,但是大雄数学太差,不会算,他就求助哆啦A梦,哆啦A梦从口袋里掏出一个斐波那契数生成器,大雄只需要说:”告诉我下一个斐波那契数“,它就会自动算出下一个斐波那契数,然后在屏幕上显示出来,就这样,大雄一个接着一个地填完了所有的空,高兴地去找静香玩耍了。这个故事里面的斐波那契数生成器其实就是一种数据结构,迭代器:
iterator (迭代器):它是一个数据产生器,你可以从它里面获取数据,规则是这样的:你每次从它里面取数据,它都会抛出一定的数据(可以是数、数组或对象等等,不限),抛出给你的数据可能是已经存储在它里面的,也可能是根据某种规则(例如例子中基于斐波那契数列的递推公式)计算出来的。iterator可以定义终止机制,当满足一定条件后,终止异常被触发,就无法再从中取值了,当然,如果不遇到这个异常,它可以源源不断地提供数据给你。
Iterator 的 Python 实现
在Python中,用Iterator类来表示实现迭代器,下面就教教你怎么实现。
Python中作如下定义:Iterator类是指具有__iter__()
和__next__()
方法的类,Iterable类是指具有__iter__()
方法的类。iterator和iterable类不是指某一个类,而是具有某种特定方法的类的通称。
from collections.abc import *
class Iter:
def __next__():
pass
def __iter__():
pass
class Iter_able:
def __iter__():
pass
iter=Iter()
iter_able=Iter_able()
print(isinstance(iter,Iterator))
print(isinstance(iter_able,Iterable))
结果:
True
True
Python中对iterator和iterable两种class的定义中对如何实现__next__
和__iter__
没有任何要求。在使用Python实现迭代器时中,通常用__next__
实现取值的操作。我们通常要求__next__
方法每次被调用都返回一个值,直到遇到StopIteration这个异常。__iter__
方法被调用要返回一个iterator对象,通常,对于iterator对象来说,它返回的是它自身。在Python中,对于iterator对象,传入next
函数,系统会调用它的__next__
函数,将返回值作为输出。对于iterable对象,传入iter
函数,系统会调用它的__iter__
函数,将返回的iterator作为输出。
iterator和iterable类的对象可以用于for循环,如果是iterator对象,每进行一次迭代,就调用一次对象的__next__
函数,以返回值赋给迭代变量;如果是iterable对象,使用时调用__iter__
方法得到一个iterator,实际上遍历的是这个iterator。
列表就是一个iterable类,但不是一个iterator类
示例:
a=list(range(10))
print(a)
for i in a:
print(i)
print(dir(a))
print(next(a))
结果:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
0
1
2
3
4
5
6
7
8
9
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
Traceback (most recent call last):
File "main.py", line 6, in <module>
print(next(a))
TypeError: 'list' object is not an iterator
那么如何自动把一个iterable转化成一个iterator?
from collections.abc import *
a=list(range(10))
print(isinstance(a,Iterable))
print(isinstance(a,Iterator))
print('--------------------')
a=iter(a)
#等价于 a=a.__iter__()
print(isinstance(a,Iterable))
print(isinstance(a,Iterator))
结果:
True
False
--------------------
True
True
迭代器主要用于惰性计算.
最新修订于2021年12月6日