python3的可迭代对象与迭代器对象

可迭代对象与迭代器对象

通过一段简单的代码来理解这俩个概念

a = [1,2,3,4]
for i in a:
	print(i)

这段代码很简单, 对 a 这个列表进行遍历, 然后打印输出每个元素, 那么遍历具体进行了那些操作呢?

  1. 首先需要确定 a(遍历的目标)要是一个 可迭代对象
  2. 如果 a 是一个 可迭代对象, 就由 a 的内置方法 __iter__() 来生成一个 迭代器对象, 这里在 python2 里面 字符串是没有 __iter__() 方法的, 用 __getitem__() 来代替, 不过 python3 已经统一为 __iter__()
  3. 然后通过迭代器对象 调用 __next__() 来遍历, Python2 中 通过迭代器对象来调用 .next() 方法
a = [1,2,3,4]
iterator = a.__iter__() # 通过可迭代对象的 __iter__() 来生成一个迭代器对象
print(next(iterator)) #调用内置函数的 next()
print(next(iterator)) #或者 next.__next__()
print(next(iterator))
print(next(iterator))
print(next(iterator))

输出结果:

1
2
3
4
Traceback (most recent call last):
  File "/home/wshuo/Desktop/python3高级用法/test.py", line 7, in <module>
    print(next(iterator))
StopIteration

当调用到最后的时候 抛出了一个 StopIteration 的报错, for循环就是通过这个报错来停止迭代的

下面一个小例子, 我们自己写一个 可迭代对象和迭代器对象

from collections import Iterable, Iterator

# 自定义了一个迭代器对象, 继承迭代器对象
class MeIterator(Iterator):
    def __init__(self, num_list):
        self.num_list = num_list
        self.index = 0

    def control(self,n):
        s = n +1
        return s

    # 自定义 __next__()方法, 为了for 循环调用
    def __next__(self):
        if self.index == len(self.num_list):
            raise StopIteration

        result = self.control(self.num_list[self.index])
        self.index += 1
        return result

# 自定义一个可迭代对象,继承可迭代对象
class MeIterable(Iterable):

    def __init__(self, num_list):
        self.num_list = num_list

    # 通过__iter__方法返回迭代器对象
    def __iter__(self):
        return MeIterator(self.num_list)

# 测试程序
for i in MeIterable([1, 2, 3]):
    print(i)

输出结果:

2
3
4

这里其实也可以不去继承 IterableIterator 这俩个类, 不过需要在你自定义的 生成器 里面 加上 __iter__() 方法, 然后返回自身, 因为不仅是 可迭代对象有这个接口, 迭代器也有这个接口, 而继承了 Iterator 就不需要写这个接口了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hello_wshuo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值