Python 为什么此DFS代码只能在生成器中调用它?
我非常感谢你的帮助。我正在研究DFS路径,我理解代码,但我不理解的是最后一行。为什么我不能只调用dfs_路径(图'A','F')而不是list(dfs_路径(图'A','F'))来让下面的代码工作?多谢各位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'
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()
——隐式迭代迭代器,为您提供整个路径