Python中的Iterator和Iterable类(迭代器和生成器)

获取更多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

迭代器主要用于惰性计算.

练习:将列表[1,2,3,4,5]打造成一个迭代器

最新修订于2021年12月6日

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值