迭代器方法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中的迭代器方法