Python返回语句未运行

时间:2013-03-22 18:44:46

标签: python

我正在创建一个程序来计算数字列表中最高的小数位数。基本上,[123, 1233]的列表将返回4,因为1233中有四个数字,它是最大的。另一个例子是[12, 4333, 5, 555555]将返回6,因为555555有6个数字。

这是我的代码。

def place(listy):  
    if len(listy) == 1:  
        decimal = len(str(listy[0]))    
        print(decimal)  
    else:  
        if len(str(listy[0])) >= len(str(listy[1])):  
            new_list = listy[0:1]  
            for i in listy[2:]:  
                new_list.append(i)  
            place(new_list)  
        else:   
            place(listy[1:]) 

现在,当我使用print(decimal)时,它会起作用,但如果我将print(decimal)更改为return decimal,则不会返回任何内容。为什么是这样?我该如何解决?我遇到过这些返回语句,它们运行了很多次。提前谢谢!

5 个答案:

答案 0 :(得分:7)

当你进行递归调用时(即当放置调用 place ,并且被调用的 place 返回一个值时,则调用 > place 也必须返回它(即返回值“冒泡”到初始调用者)。

所以你需要替换每个递归调用

place(...)

return place(...)

正如其他人所说,有更简单的解决方案,例如使用max()。如果你想保持递归方法,我会按如下方式重构你的代码:

def place2(listy):
    if len(listy) < 1:
        return None
    elif len(listy) == 1:
        return len(str(listy[0]))
    else:
        v0, v1 = listy[0], listy[1]
        if v1 > v0:
            return place2(listy[1:])
        else:
            return place2([listy[0]]+listy[2:])

虽然这是尾递归的,但Python并不关心,所以这种方法效率低下。使用max()或使用循环将是Python中更好的解决方案。

答案 1 :(得分:1)

并不是return没有做任何事情,而是你不会传播递归调用的回报。您需要更多回报:

def place(listy):  
    if len(listy) == 1:  
        decimal = len(str(listy[0]))    
        return decimal
    else:  
        if len(str(listy[0])) >= len(str(listy[1])):  
            new_list = listy[0:1]  
            for i in listy[2:]:  
                new_list.append(i)  
            return place(new_list)  # <-- return added
        else:   
            return place(listy[1:]) # <-- return added

您可以在任何级别查看打印,但要将其恢复到调用者,则需要传播它。

答案 2 :(得分:0)

如果你想要的只是找到整数列表的最大长度,请考虑:

max([len(str(n)) for n in N])

例如

N = [1,22,333,4444]
max([len(str(n)) for n in N]) # Returns 4

N = [12, 4333, 5, 555555]
max([len(str(n)) for n in N]) # Returns 6

注意:这仅适用于正整数。

或更简单:

len(str(max(N)))

这也适用于正整数。

答案 3 :(得分:0)

该函数会返回值,但不会将其打印出来。
解决此问题的一种简单方法是,只需在print语句中调用该函数即可。
即是

print(place(listy))

答案 4 :(得分:-2)

使用&#39;&#39;全局变量&#39;&#39; (谷歌)访问和更改在您的函数之外定义的变量。