python 实现 模板模式

本文介绍了如何使用模板设计模式来消除广度优先搜索(BFS)和深度优先搜索(DFS)算法中的冗余代码。通过创建一个traverse()函数,接受一个行动参数以定义路径延伸方式,实现了代码的重构。此外,还探讨了模板模式在现实生活、页码标注和应用框架中的应用,并提供了一个横幅生成器的实现作为示例。
摘要由CSDN通过智能技术生成

本文的目录地址

本文的代码地址

编写优秀代码的一个要素是避免冗余。在面向对象编程中,方法和函数是我们用来避免编写冗余代码的重要工具。回想策略模式中的sorted()例子。sorted()函数非常通用,可使用任意键来对多种数据结构(列表、元组和命名元组等)进行排序。这是一个良好函数的定义。

sorted()这样的函数属于理想的案例。现实中,我们没法始终写出100%通用的代码。许多算法都有一些(但并非全部)通用步骤。广度优先搜索(Breadth-First Search,BFS)和深度优先搜索(Depth-First Search,DFS)是其中不错的例子,这两个流行的算法应用于图搜索问题。起初,我们提出独立实现两个算法(文件graph.py)。函数bfs()和dfs()在start和end之间存在一条路径时返回一个元组(True, path);如果路径不存在,则返回(False, path)(此时,path为空)。

注意两个算法之间的相似点。仅有一处不同,其余部分完全相同。

先使用Wikipedia提供的图来测试算法。为了简化,假设该图是有向的。这意味着只能朝一个方向移动,我们可以检测如何从Frankfurt到Mannheim,而不是另一个方向。

可以使用列表的字典结构来表示这个有向图。每个城市是字典中的一个键,列表的内容是从该城市始发的所有可能目的地。叶子顶点的城市(例如,Erfurt)使用一个空列表即可(无目的地)。

#encoding:utf-8
def bfs(graph,start,end):
    path=[]
    visited=[start]
    while visited:
        current=visited.pop(0)
        if current not in path:
            path.append(current)
            if current==end:
                print(path)
                return (True,path)
            if current not in graph:
                continue
            visited=visited+graph[current]
    return (False,path)


def dfs(graph, start, end):
    path = []
    visited = [start]
    while visited:
        current = visited.pop(0)
        if current not in path:
            path.append(current)
            if current == end:
                print(path)
                return (True, path)
            # 两个顶点不相连,则跳过
            if current not in graph:
                continue
        visited = graph[current] + visited
    return (False, path)

def main():
    graph = {
        'Frankfurt': ['Mannheim', 'Wurzburg', 'Kassel'],
        'Mannheim': ['Karlsruhe'],
        'Karlsruhe': ['Augsburg'],
        'Augsburg': ['Munchen'],
        'Wurzburg': ['Erfurt', 'Nurnberg'],
        'Nurnberg': ['Stuttgart', 'Munchen'],
        'Kassel': ['Munchen'],
        'Erfurt': [],
        'Stuttgart': [],
        'Munchen': []
    }

    bfs_path = bfs(graph, 'Frankfurt', 'Nurnberg')
    dfs_path = dfs(graph, 'Frankfurt', 'Nurnberg')
    print('bfs Frankfurt-Nurnberg: {}'.format(bfs_pa
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值