【问题标题】:Python Recursive function doesn't execute rest of the outer loop when returnedPython递归函数在返回时不执行外循环的其余部分
【发布时间】:2020-11-12 11:32:35
【问题描述】:

我正在尝试从字典中获取所有键值对,我的目标是在键值对匹配某个值时从函数返回 true,如果没有匹配则返回 false。我观察到在递归调用中使用'return'时,'for'循环导航到最内层循环但停在那里并且不执行剩余的外层循环。不知道为什么?根据递归的概念,他们应该。我错过了什么?

下面是代码片段

resp = ' { "name": "Stuart", "response" : { "age" : "27", "weight" : "50"}, "address" : "New York" }'
response = json.loads(resp)

def recursive_loop(response):
    for key, value in response.items():
        if type(value) is dict:
            return recursive_loop(value)  
        elif key == "address" and value == "New York":
            print ("Match")
            return True
        else:
            print (value)
    return False
    
z = recursive_loop(response)
print (z)

我得到的输出:

Stuart
27
50
False

我期望的输出:

Stuart
27
50
Match
True

【问题讨论】:

  • 您认为什么“递归概念”应该允许函数在returning 之后恢复?
  • @ScottHunter,我明白你的意思,但有没有办法在整个执行完成之前不返回 False。我相信即使我没有在函数末尾明确使用“Return False”语句,python 默认情况下也会返回 None 停止执行。
  • 我相信您会看到这种行为,因为您同时使用了迭代和递归。正在发生的事情是,一旦 type(value) is dict 评估为 True,就会触发 return 语句,并且您正在迭代的剩余项目不会运行。也许这里的回报不是您想要的?

标签: python loops dictionary recursion return


【解决方案1】:

如果递归返回True,您只想从循环中提前返回。否则,您希望继续循环并检查其余值,以防其中一个满足您的条件。为此,只需添加一个条件来测试递归调用的结果。

def recursive_loop(response):
    for key, value in response.items():
        if type(value) is dict:
            if recursive_loop(value):
                return True
        elif key == "address" and value == "New York":
            return True
    return False

这将导致深度优先搜索,并在首次发现真实条件时返回。

【讨论】:

    【解决方案2】:

    return 停止函数的执行,无论是递归还是循环,都无法恢复。

    您可能想查看yield

    【讨论】:

      【解决方案3】:

      返回函数是问题所在。试试产量

      【讨论】:

      • 也许你可以详细说明为什么yield 可以工作,而return 不行
      猜你喜欢
      • 2022-06-15
      • 1970-01-01
      • 1970-01-01
      • 2016-06-30
      • 1970-01-01
      • 2015-04-17
      • 1970-01-01
      • 2015-11-09
      相关资源
      最近更新 更多