We. 发表于 2020-9-7 21:27

python函数递归返回值的问题!求助大佬帮忙看看

本帖最后由 We. 于 2020-9-24 20:26 编辑



如题,
我已经通过遍历字典得到了我想要的东西了。也能print出来,但是为什么return是none????
另外求助各位大佬,
    遍历json格式的字典还有更简单的方法吗?

=========================================

2020/9/8
现在问题弄明白了,就是函数中递归返回值的问题。查阅了一下资料如下:


return语句用于退出函数,向调用方返回一个表达式。return在不带参数的情况下(或者没有写return语句),
默认返回None。None是一个特殊的值,它的数据类型是NoneType。NoneType是Python的特殊类型,它只有一个取值None。
它不支持任何运算也没有任何内建方法,和任何其他的数据类型比较是否相等时永远返回false,也可以将None赋值给任何变量。。。
1》当函数没有显式return,默认返回None值2》当递归函数有return时,在递归的地方也要return,不然永远返回的是None

但是怎么改还是没有头绪。


========================================
2020/9/9
忘了把代码贴出来。
def xyz(data):
    if isinstance(data, dict):
      for j,k in data.items():
            if 'appliesTo' == j:
                print(k)
                return k
            elif isinstance(k,list):
                for i in range(len(k)):
                  if isinstance(k, dict):
                        xyz(k)
            elif isinstance(k,dict):
                xyz(k)

w = xyz(data)
print(w)
这是原来的代码。




根据提示修改过后。
def xyz(data):
    if isinstance(data, dict):
      for j,k in data.items():
            if 'appliesTo' == j:
                print(k)
                return k
            elif isinstance(k,list):
                for i in range(len(k)):
                  if isinstance(k, dict):
                        return k
                        xyz(k)
            elif isinstance(k,dict):
                return k
                xyz(k)



输出结果是:
{'combinedUnitEntitlement': {'activeWarrantyEntitlement': None, 'overallWarrantyStartDate': None, 'overallWarrantyEndDate': None, 'activeContractEntitlement': None, 'overallContractStartDate': None, 'overallContractEndDate': None, 'oos': {'ossKey': None, 'oosType': 'BD-ND5200-G2-8SFF', 'serialNumber': '21025A2E53', 'salesOrderNumber': '', 'shipToCountry': 'CN', 'shipFromCountry': 'CN', 'omSystemDesc': None, 'salesChannel': None, 'product': {'productId': '0235A2E8', 'productNumber': None, 'productDesc': '装配组件-H3C NaviData 5200 G2 8SFF-BDAZ2ND5200-CTO大数据一体机-国内版', 'productLineCode': 'NAVI', 'productLineDesc': None, 'functionalLocation': None}, 'oosCategory': 'H3C', 'snConverter': 0, 'mappingSerialNumber': '', 'projectName': ''}, 'warrantyList': [{'warrantyType': None, 'termCode': None, 'portfolioFlag': None, 'warrantyDeterminationCode': None, 'warrantyDeterminationDescription': None, 'warrantyStartDate': None, 'gracePeriod': None, 'global': None, 'installationIncluded': None, 'sitePreparation': None, 'warrantyExtension': None, 'offerList': [{'id': '1312692416', 'offerCode': '8813A04X', 'offerDesc': '基本维保5x10xNBD发出', 'svcProductType': None, 'svcProductLine': None, 'standAloneOffer': 'Factory Warranty', 'incidentBaseOffer': None, 'serviceQuantity': None, 'availableQuantity': None, 'modiferList': [], 'deliverableList': [], 'appliesTo': {'startDate': '2018-09-15', 'endDate': '2021-12-14', 'status': 'A', 'acticeAppliesTo': '', 'oosKey': ''}, 'pkgOffer': None}]}], 'contractList': [], 'locationList': [], 'contactList': []}, 'productList': None, 'esHeader': {'transactionId': None, 'warnings': {'eiaErrorList': None}}, 'apiError': None}


明显有问题,原理大概是知道了 ,问题出在我没有理解递归是怎么return的。请指教


=====================================================
2020/9/24
问题解决了,忘了回来补充了。


解决方案就是:
在函数中传入一个新的列表参数,然后在return的地方把想要的值赋给传参,然后去打印列表就OK了。
这个方法是从别人那里学来的。

感觉不是一个很好的方案,如果有人需要代码的话评论告诉我吧。
没有的话我就偷懒啦。

We. 发表于 2020-9-7 21:29

感觉应该是写法错了。脑瓜子疼。怎么改呢?

durongze 发表于 2020-9-7 21:30

return xyz(xxxxx);

durongze 发表于 2020-9-7 21:32

100行和102

kesai 发表于 2020-9-7 21:44

递归函数要return啊

挑灯看花 发表于 2020-9-7 22:30

字典要啥遍历,直接取值,没有就跳过

We. 发表于 2020-9-7 23:17

挑灯看花 发表于 2020-9-7 22:30
字典要啥遍历,直接取值,没有就跳过

因为嵌套太多层了,又有列表又有字典直接取要写好长。

We. 发表于 2020-9-7 23:19

durongze 发表于 2020-9-7 21:32
100行和102

100行和102行 我的思路是在没找到我要的东西前提下 就自己调用自己再找   你的意思我没太理解到能详细说下吗?

bookaccount 发表于 2020-9-8 04:04

这里给出了一个方法:https://stackoverflow.com/questions/14048948/how-to-find-a-particular-json-value-by-key
from __future__ import print_function
import json

def find_values(id, json_repr):
    results = []

    def _decode_dict(a_dict):
      try:
            results.append(a_dict)
      except KeyError:
            pass
      return a_dict

    json.loads(json_repr, object_hook=_decode_dict) # Return value ignored.
    return results

json_repr = '{"P1": "ss", "Id": 1234, "P2": {"P1": "cccc"}, "P3": [{"P1": "aaa"}]}'
print(find_values('P1', json_repr))

rsnodame 发表于 2020-9-8 09:45

没看懂,elif的缩进没错?
页: [1] 2 3 4
查看完整版本: python函数递归返回值的问题!求助大佬帮忙看看