迭代器 导包、获取、异常以及自定义“可迭代对象”

迭代器 导包、获取、异常以及自定义“可迭代对象”

如何判断一个对象是不是迭代器
isinstance(数据, Iterable)

导包
from collections.abc import Iterable, Iterator 导包 
  • Iterable(可迭代对象):可迭代对象的本质就是可以向我们提供一个这样二点中间’人’,即迭代器帮助我们对其进行迭代遍历使用
  • Iterator(迭代器):实现iter和next方法的类 就可以是实例化迭代器f

在对象中获取迭代器或者获取数据
# 迭代器只能获取一次,要重新获取一个迭代器才能重新获取数据
变量名 = iter(数据变量名)  
print(next(变量名))  # 第一次获取
print(next(变量名))  # 第二次获取
...
print(next(变量名))  # 第N次获取

StopIteration异常

代码示例:

from collections.abc import Iterator


nums = [11, 22, 33, 44]
nums_iter = iter(nums)

print("nums", isinstance(nums, Iterator))
print("nums_iter", isinstance(nums_iter, Iterator))


num1 = next(nums_iter)
print(num1)

num2 = next(nums_iter)
print(num2)

num3 = next(nums_iter)
print(num3)

num4 = next(nums_iter)
print(num4)

num5 = next(nums_iter)  # 这里会产生异常
print(num5)

运行结果:

nums False
nums_iter True
11
22
33
44
Traceback (most recent call last):
  File "C:/Iterator.py", line 23, in <module>
    num5 = next(nums_iter)  # 这里会产生异常
StopIteration

  • 如果next输出完数据后,再次获取数据会报错

自定义“可迭代对象”

一个类中有__iter__方法和__next__方法 就是一个迭代器

  • __iter__函数:一个具备了__iter__方法的对象,就是一个可迭代对象
  • __next__函数:
    • 函数获取可迭代对象的数据。
    • 当全部数据正常获取完毕 在__next__方法中要使用raise StopIteration抛出异常结束获取

代码示例:

class MyList(object):
    def __init__(self):
        self.container = []

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

    def __iter__(self):
        '''
        只要一个类 重写了此方法就是一个可迭代对象
        返回一个迭代器对象
        注意传入的self是MyList对象
        :return:
        '''
        return MyIterator(self)


class MyIterator(object):
    '''
    自定义一个迭代器
    实现 iter 和next方法的类 就可以实例化迭代器了
    :param object:
    :return:
    '''

    def __init__(self, mylist):
        self.mylist = mylist
        # 获取数据用的下标
        self.current_indedx = 0

    def __iter__(self):
        return self

    def __next__(self):
        if self.current_indedx < len(self.mylist.container):
            # 获取当前数据
            item = self.mylist.container[self.current_indedx]
            # 获取完数据后 下标+1
            self.current_indedx += 1
            # 数据返回
            return item
        else:
            # 全部数据正常获取完毕 这里要抛出异常
            # 把下标设置为0 下次可以继续获取
            self.current_indedx = 0
            raise StopIteration


mylist = MyList()
# 添加数据
mylist.add(1)
mylist.add(2)
mylist.add(3)
mylist.add(4)
mylist.add(5)

mylist_iter = iter(mylist)
'''
1 找到要遍历的对象的迭代器
2 调用迭代器的next方法获取数据
3 遇到StopIteration异常 停止循环
'''

for num in mylist_iter:
    print(num)
print('-----------------------------')
# mylist_iter = iter(mylist)
for num in mylist_iter:
    print(num)

运行结果:

C:\python37\pythonw.exe "C:/自定义可迭代器.py"
1
2
3
4
5
-----------------------------
1
2
3
4
5

Process finished with exit code 0
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值