📜  迭代器方法Python设计模式

📅  最后修改于: 2022-05-13 01:55:46.540000             🧑  作者: Mango

迭代器方法Python设计模式

迭代器方法是一种行为设计模式,它允许我们遍历集合的元素,而不需要暴露元素的深入细节。它提供了一种顺序访问复杂数据结构元素而不重复它们的方法。
根据GangOfFour的说法,迭代器模式用于“在不暴露其底层实现的情况下按顺序访问聚合对象的元素”

下图描述了链表数据结构。

迭代器方法链表

迭代器方法链表

不使用迭代器方法的问题

想象一下,您正在为小孩创建一个应用程序,该应用程序将任何有效的字母表作为输入并返回所有字母表。当这个应用程序只使用几次时,可以一次又一次地运行For 循环While 循环,但是当运行频率增加时,这个过程变得非常低效。所以,我们必须想办法避免这些循环。当我们处理复杂的非线性数据结构(如树、图)时,这个问题可能会变得更大,其中遍历不像数组那么简单。
下图描绘了 Tree 数据结构的图像。

迭代器方法树数据结构

迭代器方法树数据结构

使用迭代器方法的解决方案

在这里,我们将讨论上述问题的解决方案。 Python用户使用迭代器遍历任何类型的数据结构总是很方便的,无论它们是线性还是非线性数据结构。我们有两种选择在Python中实现迭代器,或者我们可以使用内置的迭代器来产生富有成效的输出,或者我们可以明确地在生成器的帮助下创建迭代。在下面的代码中,我们在生成器的帮助下显式创建了迭代器。

注意:以下代码是显式创建的 Iterator 方法的示例

Python3
""" helper method for iterator"""
 
 
def alphabets_upto(letter):
    """Counts by word numbers, up to a maximum of five"""
    for i in range(65, ord(letter)+1):
            yield chr(i)
 
 
"""main method"""
if __name__ == "__main__":
 
    alphabets_upto_K = alphabets_upto('K')
    alphabets_upto_M = alphabets_upto('M')
 
    for alpha in alphabets_upto_K:
        print(alpha, end=" ")
 
    print()
 
    for alpha in alphabets_upto_M:
        print(alpha, end=" ")


Python3
"""utility function"""
def inBuilt_Iterator1():
     
    alphabets = [chr(i) for i in range(65, 91)]
     
    """using in-built iterator"""
    for alpha in alphabets:
        print(alpha, end = " ")
    print()
 
"""utility function"""
def inBuilt_Iterator2():
     
    alphabets = [chr(i) for i in range(97, 123)]
     
    """using in-built iterator"""
    for alpha in alphabets:
        print(alpha, end = " ")
    print()
 
 
"""main method"""
if __name__ == "__main__" :
     
    """call the inbuiltIterators"""
    inBuilt_Iterator1()
    inBuilt_Iterator2()


注意:以下代码是使用内置迭代器方法的示例

Python3

"""utility function"""
def inBuilt_Iterator1():
     
    alphabets = [chr(i) for i in range(65, 91)]
     
    """using in-built iterator"""
    for alpha in alphabets:
        print(alpha, end = " ")
    print()
 
"""utility function"""
def inBuilt_Iterator2():
     
    alphabets = [chr(i) for i in range(97, 123)]
     
    """using in-built iterator"""
    for alpha in alphabets:
        print(alpha, end = " ")
    print()
 
 
"""main method"""
if __name__ == "__main__" :
     
    """call the inbuiltIterators"""
    inBuilt_Iterator1()
    inBuilt_Iterator2()

类图

以下是迭代器方法的类图

迭代器方法类图

迭代器方法类图

好处

  • 单一职责原则:在 Iterator 方法中将庞大的算法提取到单独的类中真的很容易。
  • 开放/封闭原则:将新的迭代器和集合传递给客户端代码不会破坏代码,可以很容易地安装到其中。
  • 易于使用的界面:它使界面非常易于使用,并且还支持集合遍历的变化。

缺点

  • 不必要的资源浪费:使用迭代器方法并不总是一个好习惯,因为有时在不需要复杂事物的简单应用程序中,它可能会被证明是对资源的过度杀伤。
  • 增加复杂性:正如我们之前所说,使用 Iterator 方法会使简单的应用程序变得复杂。
  • 降低效率:就效率而言,与使用迭代器访问元素相比,直接访问元素是一个更好的选择。

适用性

  • 有限暴露:当您想访问较低级别的元素时,即您对元素的内部实现不感兴趣,那么总是首选使用迭代器方法。
  • 遍历未知数据结构:迭代器方法可以很容易地用于遍历各种类型的数据结构,例如树、图、堆栈、队列等,因为代码为集合和迭代器提供了几个通用接口。

进一步阅读 – Java中的迭代器方法