吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1206|回复: 35
收起左侧

[已解决] python函数递归返回值的问题!求助大佬帮忙看看

[复制链接]
We. 发表于 2020-9-7 21:27
本帖最后由 We. 于 2020-9-24 20:26 编辑

微信截图_20200907212442.png

如题,
我已经通过遍历字典得到了我想要的东西了。也能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
忘了把代码贴出来。
[Python] 纯文本查看 复制代码
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[i], dict):
                        xyz(k[i])
            elif isinstance(k,dict):
                xyz(k)

w = xyz(data)
print(w)

这是原来的代码。




根据提示修改过后。
[Python] 纯文本查看 复制代码
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[i], dict):
                        return k[i]
                        xyz(k[i])
            elif isinstance(k,dict):
                return k
                xyz(k)



输出结果是:
[Python] 纯文本查看 复制代码
{'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
durongze 发表于 2020-9-7 21:32
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

100行和102行 我的思路是在没找到我要的东西前提下 就自己调用自己再找   你的意思我没太理解到  能详细说下吗?
bookaccount 发表于 2020-9-8 04:04
这里给出了一个方法:https://stackoverflow.com/questi ... r-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[id])
        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的缩进没错?
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-26 13:54

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表