美文网首页
小结-Python-迭代器的实现方式

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

作者: Andrew0000 | 来源:发表于2019-05-06 15:51 被阅读0次

    自定义迭代器

    由于迭代器是一种类型,需要使用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
    

    小结:

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

    相关文章

      网友评论

          本文标题:小结-Python-迭代器的实现方式

          本文链接:https://www.haomeiwen.com/subject/rgqdoqtx.html