首页 > 解决方案 > Python 中递归乐趣的返回值

问题描述

我正在尝试编写一个函数,该函数将字典作为值,如果字典中存在键则返回。我调试了函数,我发现即使函数输入了应该返回 True 的代码,它仍然在调用其他递归调用,并且返回 none 而不是初始 True 值。

功能:

def checkIfKeyExsists(self,searchKey,passingValue):
        if searchKey in passingValue:
            return True
        else:
        
            for value in passingValue.values():
                
                if type(value) == dict:
                    if searchKey in value.keys():
                        print("yes")
                        return  True
                    else:
                        self.checkIfKeyExsists(searchKey,value)
                        
                elif type(value) == list:
                    for dicInLst in value:
                        self.checkIfKeyExsists(searchKey,dicInLst)

我使用的字典:

thisdict = {
  "brand": "Ford",
  "model": {"Mustang":{"car":"motti","car123":"34"}},
  "year": [{"a":"test"},{"c":"er"}] }      
   
jn = JsonNode(thisdict)
x = jn.checkIfKeyExsists("car",jn.getJsonDic())

**此函数是调用 JsonNode 的类的一部分

标签: python-3.x

解决方案


您的递归函数存在三个问题。

首先,您不会在函数结束时返回任何内容。那么,如果您不属于代码的不同分支,会发生什么?然后该函数将返回 None 如您所见。所以首先你应该用return False.

其次,您不对递归调用返回的值做任何事情。因此,这个值被忽略了。所以这就是为什么即使找到密钥,你也会继续执行递归调用。你应该这样做:替换

self.checkIfKeyExsists(searchKey,dicInLst)

经过

if(self.checkIfKeyExsists(searchKey,dicInLst)):
   return True

最后,它不会影响您的函数的正确性,但您的检查if searchKey in value.keys()实际上是无用的,因为它if searchKey in passingValue在执行递归调用时已经作为第一个测试 ( ) 执行。因此,您的递归调用 ( ) 将涵盖这种情况self.checkIfKeyExsists(searchKey,value)


推荐阅读