Python返回语句未执行

1 投票
5 回答
8354 浏览
提问于 2025-04-17 20:00

我正在创建一个程序,用来找出一组数字中小数位数最多的那个。简单来说,如果有一个列表,比如[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 个回答

1

这个函数确实返回了一个值,但它没有把这个值打印出来。
解决这个问题的简单方法就是在打印语句中调用这个函数。
也就是说:

print(place(listy))
1

并不是说return没有作用,而是你没有把递归调用的返回值传递回去。你需要多加几个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

你可以在任何层级看到打印的内容,但要把它传回给调用者,就需要把它传递下去。

9

当你进行递归调用时(也就是说,当一个叫做 place 的函数又去调用自己 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() 函数或者使用循环会是更好的选择。

撰写回答