python三大器之迭代器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python三大器之迭代器相关的知识,希望对你有一定的参考价值。

python中的三大器有迭代器,生成器,装饰器,本文重点讲解下迭代器

迭代器:具备了__next__和__iter__方法的对象

可迭代对象:具备了__iter__方法的对象

1.可迭代对象,可以通过for...in...这类语句迭代读取一条数据供我们使用的对象称之为可迭代对象(Iterable),可以通过isinstance()判断

In [1]: from collections import Iterable

In [2]: isinstance({},Iterable)
Out[2]: True

In [3]: isinstance((),Iterable)
Out[3]: True

In [4]: isinstance("",Iterable)
Out[4]: True

In [5]: for item in {}:
   ...:     pass
   ...: 

In [6]: for item in "":
   ...:     pass
   ...: 

In [7]: for item in ():
   ...:     pass
   ...: 

2.for in的本质

li = [100, 200, 300, 400]
# for num in li:
#     print(num)


# 1. 通过调用可迭代对象的__iter__()获取迭代器
# 2. 对迭代器调用__next__进行迭代操作,
#     如果没有抛出StopIteration异常,表示迭代没有结束,把获取到的数据元素放到变量中
#     如果抛出了异常,表示迭代结束,退出执行
# 3. 执行循环体
# 4. 跳转到第2步执行

iterator = li.__iter__()

while True:
    try:
        num = iterator.__next__()
    except StopIteration:
        break
    else:
        print(num)

3.自定义迭代器

class MyIterable(object):
    def __init__(self):
        self.container = [] # 定义一个容器

    def add(self, item):
        self.container.append(item)

    def __iter__(self):
        return Iterator(self.container) # 返回一个迭代器


class Iterator(object):
    def __init__(self, container):
        self.container = container
        self.i = 0

    def __next__(self):
        if self.i < len(self.container):
            count = self.i
            self.i += 1
            return self.container[count]
        else:
            raise StopIteration

    def __iter__(self):
        pass


mi = MyIterable()
it = mi.__iter__()
mi.add(1)
mi.add(2)
mi.add(3)

for item in mi:
    print(item)

from collections import Iterator

print(isinstance(it, Iterator))

 

4.合并迭代器,Python要求定义的迭代的迭代器必须实现__iter__(self),并且返回self。通常,一个可迭代对象对象的迭代器都是固定的,并且,类与类

之间需要距离性,对象之间需要相似性,所以通常可迭代对象和迭代器写在一起,就是下面的。

class MyIterable(object):
    def __init__(self):
        self.container = []
        self.i = 0

    def add(self, item):
        self.container.append(item)

    def __next__(self):
        if self.i < len(self.container):
            count = self.i
            self.i += 1
            return self.container[count]
        else:
            raise StopIteration

    def __iter__(self):
        return self


mi = MyIterable()
mi.add(1)
mi.add(2)
mi.add(3)

for item in mi:
    print(item)

 

以上是关于python三大器之迭代器的主要内容,如果未能解决你的问题,请参考以下文章

Python三大器之生成器

python三大器之装饰器的练习

python基础三大器之装饰器

python 迭代器之chain

Java三大器之监听器(Listener)的工作原理和代码演示

Java三大器之拦截器(Interceptor)的实现原理及代码示例