在Python中更改布尔函数的值

时间:2016-12-20 04:15:29

标签: python algorithm python-2.7 graph-algorithm

我想将布尔函数的默认值设置为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)

3 个答案:

答案 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)

此外,根据vw的类型,您可能会收到错误消息not hashable, for which see this question.

答案 2 :(得分:0)

假设你有一个myfunc函数返回一个布尔值,你想修改行为:

_myfunc = myfunc

def myfunc(*args):
    if some_condition:
        _myfunc(*args)
    else:
        return False

这样,您只会在希望的情况下触发实际功能。

此解决方案会覆盖原始名称,但您没有义务这样做。