Python 为什么此DFS代码只能在生成器中调用它?

Python 为什么此DFS代码只能在生成器中调用它?,python,generator,depth-first-search,Python,Generator,Depth First Search,我非常感谢你的帮助。我正在研究DFS路径,我理解代码,但我不理解的是最后一行。为什么我不能只调用dfs_路径(图'A','F')而不是list(dfs_路径(图'A','F'))来让下面的代码工作?多谢各位 graph = {'A': set(['B', 'C']), 'B': set(['A', 'D', 'E']), 'C': set(['A', 'F']), 'D': set(['B']), 'E': set(['B'

我非常感谢你的帮助。我正在研究DFS路径,我理解代码,但我不理解的是最后一行。为什么我不能只调用dfs_路径(图'A','F')而不是list(dfs_路径(图'A','F'))来让下面的代码工作?多谢各位

graph = {'A': set(['B', 'C']),
         'B': set(['A', 'D', 'E']),
         'C': set(['A', 'F']),
         'D': set(['B']),
         'E': set(['B', 'F']),
         'F': set(['C', 'E'])}

def dfs_paths(graph, start, goal):
    stack = [(start, [start])]
    while stack:
        (vertex, path) = stack.pop()
        for next in graph[vertex] - set(path):
            if next == goal:
                yield path + [next]
            else:
                stack.append((next, path + [next]))

dfs_paths(graph, 'A', 'F')

因为dfs\u路径不是常规函数;这是一个生成函数。当您运行该函数时,它只返回一个生成器,在您开始迭代返回值之前,不会实际执行正文中的任何代码。该迭代可以通过
for
循环显式进行:

for path in dfs_paths(graph, 'A', 'F'):
    ...
或通过使用迭代器的函数(如
list
)隐式执行:

paths = list(dfs_paths(graph, 'A', 'F'))

这是函数中的yield语句

其中有收益的方法是生成器。生成器在调用时返回迭代器。如果您想要获得完整的返回值(整个路径),您必须在迭代器上完成迭代。因此需要
list()
——隐式迭代迭代器,为您提供整个路径