Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 返回字典get方法中的递归_Python_Recursion_Return_Return Value - Fatal编程技术网

Python 返回字典get方法中的递归

Python 返回字典get方法中的递归,python,recursion,return,return-value,Python,Recursion,Return,Return Value,使用MWE。函数foo工作正常,bar不工作,并引发“RuntimeError:超过最大递归深度”异常。有什么提示吗 def foo(i1, i2): inverse_map = {"<": ">"} if i1[1] < i2[0]: return "<" return inverse_map[foo(i2, i1)] def bar(i1, i2): inverse_map = {"<": ">"} return

使用MWE。函数
foo
工作正常,
bar
不工作,并引发“RuntimeError:超过最大递归深度”异常。有什么提示吗

def foo(i1, i2):
    inverse_map = {"<": ">"}
    if i1[1] < i2[0]: return "<"
    return inverse_map[foo(i2, i1)]

def bar(i1, i2):
    inverse_map = {"<": ">"}
    return {
        i1[1] < i2[0]: "<"
    }.get(True, inverse_map[bar(i2, i1)])

i1, i2 = (0, 2), (4, 6)
print foo(i2, i1), ">"
print bar(i2, i1), ">"
def foo(i1,i2):
逆映射={'}
如果i1[1]
按照您的编码方式,您没有退出bar的条件。i1[1]
return "<" if i1[1] < i2[0] else inverse_map[bar(i2, i1)]

return”python dictionary
get
方法首先检查默认值,因此,在
bar
函数中,它将在
return
值之前递归调用
bar
。您的代码可以转换为以下格式,这将导致死递归:

def foo(i1, i2):
    inverse_map = {"<": ">"}
    if i1[1] < i2[0]: return "<"
    return inverse_map[foo(i2, i1)]

def bar(i1, i2):
    inverse_map = {"<": ">"}
    d = {i1[1] < i2[0] : "<"}
    inverse = inverse_map[bar(i2,i1)]
    return d.get(True,inverse)

i1, i2 = (0, 2), (4, 6)
print foo(i1, i2), ">"
print bar(i2, i1), ">"

对于我上面的问题,这是我发现的执行递归的唯一方法

def bar(i1, i2):
    d = lambda i1, i2: {i1[1] < i2[0]: "<"}.get(True)
    inverse_map = {"<": ">"}
    a = d(i1, i2)
    return a if a else inverse_map[d(i2, i1)]
def条(i1、i2):

d=lambda i1,i2:{i1[1]i1[1]get
方法,没有更清楚这里出了什么问题。我认为这里的基本条件是
i1[1]True
False
,取决于值
i1[1]
。谢谢。不幸的是,三元运算符不是一个选项,因为有多种情况。你可以嵌套三元运算符,就像if语句一样。但是,它们很快就会变得难以阅读。谢谢,我不知道关于
get
。通过在其中包含lambda关系做了类似的事情,但我更喜欢你的,因为它在一个实例中完成了旁注:计时
foo
bar
方法我没有看到任何显著的差异,事实上,if语句的
foo
在计时上似乎更稳定,而字典的
bar
则有一些尖峰。这两种方法都有十几种情况。奇怪。需要在上面计时。遵循earli不幸的是,我测试了你的脚本,它仍然提供无限递归,无论是正向还是反向。
static PyObject *
dict_get(register PyDictObject *mp, PyObject *args)
{
    PyObject *key;
    PyObject *failobj = Py_None;
    PyObject *val = NULL;
    long hash;
    PyDictEntry *ep;
    #commented by myself, get function first check default value
    if (!PyArg_UnpackTuple(args, "get", 1, 2, &key, &failobj))
        return NULL;

    if (!PyString_CheckExact(key) ||
        (hash = ((PyStringObject *) key)->ob_shash) == -1) {
        hash = PyObject_Hash(key);
        if (hash == -1)
            return NULL;
    }
    ep = (mp->ma_lookup)(mp, key, hash);
    if (ep == NULL)
        return NULL;
    val = ep->me_value;
    if (val == NULL)
        val = failobj;
    Py_INCREF(val);
    return val;
}
def bar(i1, i2):
    d = lambda i1, i2: {i1[1] < i2[0]: "<"}.get(True)
    inverse_map = {"<": ">"}
    a = d(i1, i2)
    return a if a else inverse_map[d(i2, i1)]