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)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值