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 个回答
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() 函数或者使用循环会是更好的选择。