Iterator

文章摘录至:iterator

何谓Iterator?
实际上, 他就是一个迭代器. 在每种编程语言里面, 都有 for...of.. 或者 for...in... 等类似简便遍历。 这里遍历运用的机理就是迭代器.
在python里面, 基本上所有的数据结构都有迭代器的属性. 比如: list,tuple,set,string等. 迭代器对象上有两个基本方法:

  1. iter(): 返回iterator 对象

  2. next(): 返回下一个值的内容

上面这两种,就叫做iterator protocol. 就和在js中的[Symbol.iterator]方法一样, 他需要具备next=>{vlaue,done} 这样的返回内容.

迭代方法

每一个iterator 都会具备两个基本的method. 就是上面所述的 iter(),next(). 另外, 你还可以显示的使用 iter()和next()来进行调用, 其实内部也是调用iter(),next() 两个方法.
以list为例:

a_list = [x for x in range(10)]print(a_list.__iter__())# 得到的就是iterator对象

当然,也可以使用iter()方法进行转化.
我们接下来就可以利用next()进行迭代.

iter_of_list = a_list.__iter__()print(iter_of_list.__next__())  # 0print(iter_of_list.__next__())  # 1print(iter_of_list.__next__())  # 2

当已经遍历到最后时, next() 则会返回StopIteration 的异常. 所以,这需要进行捕获排除.
比如, 我们可以使用while模拟一下,简单的for...in... 遍历

iter_of_list = a_list.__iter__()def iterable(iterable):    while True:        try:            print(iterable.__next__())        except StopIteration:            breakiterable(iter_of_list)

Iterator就是为for...in...这种快捷遍历方式而准备的. 如果有时候,我们自定义了自己的数据结构, 并且也想使用for...in...循环那应该怎么做呢? 方法是有的, 只要你自己定义了iter(),next()这 两个方法即可.

Building own Iterator

经过上面的介绍, 我们大致了解到. 使用iter() 是用来返回iterator对象. 那么应该怎么返回呢? 实际上,只要返回你自身即可. 即相当于,返回一个对象, 他可以调用iter(),next()这 两个方法.
next() 则使用来返回下一个值(当然, 怎么返回时看你自己定义的)
看个详细的demo:

class Xlist:    def __init__(self,a_list):        self.list = a_list        self.index = 0    def __iter__(self):        return self    def __next__(self):        length = len(self.list)        if(length==self.index):            # 提出异常            raise StopIteration        else:            result = self.list[self.index]            self.index += 1            return resulta_list = [x for x in range(10)]x_list = Xlist(a_list)for x in x_list:    print(x)

这里,还有个trick. 我们可以构建一个无限迭代的Iterator. 有两种方法: 1. 直接使用iter()函数 2. 自己构建Iterator. 无限迭代常用于数字类型, 我们也已理解为,随着时间推移,获取增长型数字的过程. 在python中, 无限迭代并不会让你的程序崩溃,只要你不利用已经产生的所有值来do something, 更泛一点的说法是, 不引用以前所产生的全部结果.

使用iter()函数
他的基本格式除了: iter(iterable) 这样调用, 还有一种是:

iter(callable, sentinel)

callable是用来产生值的 函数, sentinel是上限值.
我们来生成无限个1:

infinit_1 =  iter(lambda :1,2)# 访问infinite_1 = iter(lambda :1,2)for x in infinite_1:    print(x)

但这种方式,比较boring, 不够灵活, 我们可以使用自定义的iterator来完成. 他的关键点就在于, 只要我们不提出 StopIteration 则, 迭代器就会一直持续下去

使用自定义Iterator
接下来,我们可以用这个来模拟生成无限个偶数的效果.

# 运行需谨慎class InfiniteOdd:    def __init__(self,start=1):        self.start = start    def __iter__(self):        return self    def __next__(self):        result = self.start        self.start *=2        return resultodd = InfiniteOdd()for x in odd:    print(x)

最后看一下总结吧:

关键字:iterator, next, iter, a_list

版权声明

本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处。如若内容有涉嫌抄袭侵权/违法违规/事实不符,请点击 举报 进行投诉反馈!

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部