如何在 Python 中存储递归函数的输出?

Posted

技术标签:

【中文标题】如何在 Python 中存储递归函数的输出?【英文标题】:How to store the output of a recursive function in Python? 【发布时间】:2020-12-23 00:46:39 【问题描述】:

我已经创建了一个这样的字典:

d = 1: 3: , 4: 6: , 5: 

然后我遍历所有项目,我可以递归地做到这一点:

def pretty(d, indent=0):
    for key, value in d.items():
        print('\t' * indent + str(key))

        if isinstance(value, dict):
            pretty(value, indent+1)
        else:
            print('\t' * (indent+1) + str(value))

pretty(d)

我的目标是以我可以操作的方式将输出存储到字符串变量中。因此结果应该是这样的:

msg ="""
1
        3
        4
                6
5
"""

我尝试通过以下实现实现我的目标:

def pretty(d, indent=0, indent_before=0, msg_old=""):
    for key, value in d.items():
        #print('\t' * indent + str(key) + '()()'.format(indent,indent_before))
        msg = msg_old+'\t' * indent + str(key) + '()()\n'.format(indent,indent_before)
        if isinstance(value, dict):
            pretty(value, indent+1, indent, msg)
        else:
            print('\t' * (indent+1) + str(value))
    return msg
    
msg = pretty(result)
print(msg)

但我尝试的输出是:None

您能否提出一种聪明而优雅的方法来达到预期的效果?

【问题讨论】:

请详细解释“没有成功”是什么意思,您的函数应该如何工作,以及它在什么时候首先出错。 【参考方案1】:

主要问题是在您的递归调用中,您丢弃了返回值(即调用pretty,但没有将返回值附加到现有消息中)。

这是一个基于您的原始代码的解决方案。

d = 1: 3: , 4: 6: , 5: 

def pretty(d, indent=0):
    msg = ''
    for key, value in d.items():
        msg += '\t' * indent + str(key) + '\n'
        if isinstance(value, dict):
            msg += pretty(value, indent+1)  # <=== see how return value is used
        else:
            msg += '\t' * (indent+1) + str(value) + '\n'
    return msg

print(pretty(d))

【讨论】:

【参考方案2】:

我知道您正在尝试实现自己的解决方案,但您从未提及为您完成这一切的内置 pprint 库/函数:

from pprint import pformat
d = 1: 3: , 4: 6: , 5: 
print(pformat(d, indent=0))

1: 3: , 4: 6: , 5: 

【讨论】:

OP 想要返回一个字符串,所以你可能想要pprint.pformat 而不是pprint.pprint【参考方案3】:

如果你的 dict 格式正确,那么你可以使用:

>>> def pretty(d, indent=0):
...     return "".join(["\n" + "\t" * indent + str(k) +
...                     pretty(v, indent + 1) for k, v in d.items()])
...
>>> d = 1: 3: , 4: 6: , 5: 
>>> pretty(d)
'\n1\n\t3\n\t4\n\t\t6\n5'
>>> print(pretty(d))

1
        3
        4
                6
5

【讨论】:

以上是关于如何在 Python 中存储递归函数的输出?的主要内容,如果未能解决你的问题,请参考以下文章

python-15

c#如何让递归函数输出多个结果

python学习第十四天

利用递归函数求斐波那契值python版

递归函数的内存分配

python之递归函数