这个递归函数有问题

时间:2014-07-11 21:55:24

标签: python

请参阅以下功能。我想要做的是取我发送的任何字符串,搜索'['和']'字符。如果它们存在,则分割出这部分文本,删除括号并将其转换为字典。然后我尝试匹配dict中的任何值到attrs列表。如果匹配,则将该值插回原始字符串,然后使用新字符串再次调用该函数。条件然后检查是否有更多括号,如果没有,则返回新字符串。

但是当我运行代码时,我为text1返回的值是None。我将print语句放在else子句中以查看那里会发生什么,并且按照我的预期打印新字符串,但是这个字符串不会在return语句中传回。

当我使用text2调用该函数时,该函数与我期望text1保持的字符串相同,该值实际上是分配给string2的原始字符串。

import ast

string1 = "Lorem ipsum dolor sit amet, consectetur adipisicing elit [{'do':'said', 'eiusmod':'tempor', 'incididun':'ut'}]"

string2 = "Lorem ipsum dolor sit amet, consectetur adipisicing elit"



def formatter(content):
    if content.find('[') >= 0:
        attrs = ['do', 'fum']
        ind, indend = content.find('['), content.find(']')
        choice = ast.literal_eval(content[ind+1:indend])
        for attr in attrs:
            for key, value in choice.iteritems():
                if attr == key:
                    new_choice = choice[key]
                    new_string = content[:ind] + new_choice + content[indend+1:]
                    formatter(new_string)
    else:
        return content

text1 = formatter(string1)
text2 = formatter(string2)
print text1
print text2

1 个答案:

答案 0 :(得分:1)

我已经稍微调整了一下你的代码,以便更清楚地发生了什么:

import ast

string1 = "Lorem ipsum dolor sit amet, consectetur adipisicing elit [{'do':'said', 'eiusmod':'tempor', 'incididun':'ut'}]"

string2 = "Lorem ipsum dolor sit amet, consectetur adipisicing elit"



def formatter(content):
    print "content: %s" % content
    if content.find('[') >= 0:
        print "running if"
        attrs = ['do', 'fum']
        ind, indend = content.find('['), content.find(']')
        choice = ast.literal_eval(content[ind+1:indend])
        for attr in attrs:
            for key, value in choice.iteritems():
                if attr == key:
                    new_choice = choice[key]
                    new_string = content[:ind] + new_choice + content[indend+1:]
                    print "calling formatter with: %s" % new_string
                    formatter(new_string)
                    print "back from recursion"
    else:
        print "running else"
        print content
        return content

print "string1"
print formatter(string1)
print "string2"
print formatter(string2)

如果查看输出,您会看到在第一次传递时找到了[,因此我们进入if子句。在一种情况下发现attr == key为真,所以我们进入内部if子句,然后触发递归调用formatter(new_string)

在那个调用中,没有[所以content返回到格式化程序的原始运行...它被丢弃,因为递归调用formatter()的输出是没有分配给任何东西。

循环最终结束,执行结束,没有从函数返回任何内容。

如果你想让content冒泡回调用堆栈,你必须从递归调用中获取返回值并对其执行某些操作。你最终需要返回它,但是如果你想要捕获所有匹配,你需要做一些事情,比如在迭代attrs时建立一个返回值列表然后在最后返回整个列表。