Python 返回字典get方法中的递归
使用MWE。函数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
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 dictionaryget
方法首先检查默认值,因此,在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)]