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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chouzhou9701/article/details/88622142

可迭代对象与迭代器对象

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

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 就不需要写这个接口了

猜你喜欢

转载自blog.csdn.net/chouzhou9701/article/details/88622142