Iterator

文章摘录至:iteratorpython

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

  • __iter__(): 返回iterator 对象数据结构

  • __next__(): 返回下一个值的内容编程语言

上面这两种,就叫作iterator protocol. 就和在js中的[Symbol.iterator]方法同样, 他须要具有next=>{vlaue,done} 这样的返回内容.函数

迭代方法

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

a_list = [x for x in range(10)]
print(a_list.__iter__())
# 获得的就是iterator对象
<list_iterator object at 0x102e431d0>

固然,也可使用iter()方法进行转化.
咱们接下来就能够利用__next__()进行迭代.spa

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

当已经遍历到最后时, __next__() 则会返回StopIteration 的异常. 因此,这须要进行捕获排除.
好比, 咱们可使用while模拟一下,简单的for...in... 遍历code

iter_of_list = a_list.__iter__()

def iterable(iterable):
    while True:
        try:
            print(iterable.__next__())
        except StopIteration:
            break

iterable(iter_of_list)

Iterator就是为for...in...这种快捷遍历方式而准备的. 若是有时候,咱们自定义了本身的数据结构, 而且也想使用for...in...循环那应该怎么作呢? 方法是有的, 只要你本身定义了__iter__(),__next__()这 两个方法便可.对象

Building own Iterator

通过上面的介绍, 咱们大体了解到. 使用__iter__() 是用来返回iterator对象. 那么应该怎么返回呢? 实际上,只要返回你自身便可. 即至关于,返回一个对象, 他能够调用__iter__(),__next__()这 两个方法.
而 __next__() 则使用来返回下一个值(固然, 怎么返回时看你本身定义的)
看个详细的demo:rem

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 result

a_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 result

odd = InfiniteOdd()
for x in odd:
    print(x)

最后看一下总结吧:

Iterator

相关文章
相关标签/搜索