小结-Python-迭代器的实现方式

2019-05-06  本文已影响0人  Andrew0000

自定义迭代器

由于迭代器是一种类型,需要使用class关键字定义。迭代器需要实现next方法、iter方法以及函数初始化init方法

# -*- coding: utf-8 -*-
from collections.abc import Iterable
from collections.abc import Iterator

""" 反向遍历序列的迭代器"""


class Reverse_list:
    # 定义初始化函数,接受一个参数;
    def __init__(self, data):
        self.data = data
        self.index = len(data)

    # 定义iter方法,那么它就是一个可迭代对象
    def __iter__(self):
        return self

    # 定义next方法,那么它就是一个迭代器
    def __next__(self):
        if self.index == 0:
            raise StopIteration
        self.index = self.index - 1
        return self.data[self.index]


# 新建一个列表,调用自定义的迭代器
listTest = [1, 2, 3, 4, 5]
rev = Reverse_list(listTest)
print(isinstance(rev, Iterable), isinstance(rev, Iterator))
for i in rev:
    # for循环在遍历迭代器的时候,实际上同时调用了iter方法和next方法实现遍历。
    print(i, end=" ")
# Output:   True True   5 4 3 2 1

通过自定义迭代器的方式创建一个迭代器,实现了反向遍历的需求。

生成器实现迭代器

除去自定义迭代器,上一篇讲到关于生成器就是用于创建迭代器的,其形式类似于普通定义的函数,使用yield函数。相比较于自定义迭代器实现来说,生成器创建迭代器降低其复杂性。

# -*- coding: utf-8 -*-
from collections.abc import Iterable
from collections.abc import Iterator

# 使用生成器创建迭代器,只需要像定义普通函数一样,给定参数、写出逻辑、关键字yield;
def generator_Reverse_list(data):
    for index in range(len(data) - 1, -1, -1):
        # 比较自定义迭代器实现反向遍历的逻辑,显然生成器更简洁。
        yield data[index]


rev = generator_Reverse_list([1, 2, 3, 4, 5])
print(isinstance(rev, Iterable), isinstance(rev, Iterator))
for i in rev:
    print(i, end=" ")
# Output:   True True   5 4 3 2 1

小结:

实现迭代器有两种方式,第一种就是直接自定义迭代器,第二种就是生成器实现迭代器。相比较而言,通过生成器实现迭代器的方式更简洁高效,值得提倡和推荐。

上一篇下一篇

猜你喜欢

热点阅读