我想将布尔函数的默认值设置为False,并希望仅对代码之间的某些输入值将其更改为True。有办法吗?
我试图编写一个简单的DFS搜索代码。 我使用的代码是:
def visited(v):
return False
def explore(v):
visited(v) = True
for (v,w) in E:
if not visited(w):
explore(w)
答案 0 :(得分:1)
这里的功能可能是错误的工具。相反,尝试一下:
def explore(v, visited=set()):
visited.add(v)
for (v,w) in E:
if w not in visited:
explore(w)
我在Python中使用a sometimes unintuitive behavior of default arguments作为此示例代码,因为它很方便,但您也可以使用不同的方式维护共享集,例如初始化a的包装函数空白集然后调用递归辅助函数。 (这样可以通过每次重置集合来多次探索。)
答案 1 :(得分:0)
不,您不能从函数外部设置函数的返回值。相反,在调用函数中使用变量。
例如,在这里,您想要记住您访问过的节点。 set
有助于记住一组对象。
def explore(v):
visited.add(v)
for (v,w) in E:
if w not in visited:
explore(w)
对此有几点警告:
如果你两次调用它,一切都将被视为已经访问过,因为状态是在全局中跟踪的。这与您已经拥有的相似,但可能是也可能不是您想要的。如果您希望能够迭代两次,则需要将其作为参数传递,并且最好添加第二个启动递归的函数:
def explore(v):
return explore_down(v, set())
def explore_down(v, visited):
visited.add(v)
for (v,w) in E:
if w not in visited:
explore(w)
此外,根据v
和w
的类型,您可能会收到错误消息not hashable, for which see this question.
答案 2 :(得分:0)
假设你有一个myfunc
函数返回一个布尔值,你想修改行为:
_myfunc = myfunc
def myfunc(*args):
if some_condition:
_myfunc(*args)
else:
return False
这样,您只会在希望的情况下触发实际功能。
此解决方案会覆盖原始名称,但您没有义务这样做。