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了。
这个方法是从别人那里学来的。
感觉不是一个很好的方案,如果有人需要代码的话评论告诉我吧。
没有的话我就偷懒啦。 感觉应该是写法错了。脑瓜子疼。怎么改呢? return xyz(xxxxx); 100行和102 递归函数要return啊 字典要啥遍历,直接取值,没有就跳过 挑灯看花 发表于 2020-9-7 22:30
字典要啥遍历,直接取值,没有就跳过
因为嵌套太多层了,又有列表又有字典直接取要写好长。 durongze 发表于 2020-9-7 21:32
100行和102
100行和102行 我的思路是在没找到我要的东西前提下 就自己调用自己再找 你的意思我没太理解到能详细说下吗? 这里给出了一个方法: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)) 没看懂,elif的缩进没错?