return的作用是將函數(shù)結(jié)果返回,即退出def函數(shù)模塊。大量的教材和網(wǎng)上教程都有說明函數(shù)執(zhí)行遇到return就會結(jié)束,返回一個值給調(diào)用函數(shù)處。常規(guī)用法確實(shí)是這樣,但在遞歸調(diào)用中卻存在一個坑,今天就遇到了,舉個例子:
一個簡單的不斷相加的遞歸小程序:
def add(sum,x,y):
if sum<10:
x +=2
y +=2
sum=x+y
add(sum,x,y)
else:
sum=x+y
return sum
print add(0,0,0)
運(yùn)行程序得到的結(jié)果為:
結(jié)果卻是None,讓人匪夷所思,更改一下,在return前打印出返回值:
經(jīng)過計算,結(jié)果確實(shí)應(yīng)該是12,明明已經(jīng)計算出了正確的值,為什么函數(shù)返回值是None呢。經(jīng)過多方查閱,發(fā)現(xiàn)自己踩坑里去了,慣性思維讓我認(rèn)為return必然會使得def函數(shù)模塊結(jié)束返回一個值,可實(shí)際上在遞歸中并不是,如果改變約束條件在return之后函數(shù)還會繼續(xù)遞歸計算。
真正的原因是此處的return僅僅是上一次遞歸調(diào)用函數(shù)本身時候的返回值,而def函數(shù)塊并沒有返回任何值。也就是說這個return僅屬于上一次遞歸調(diào)用,并不屬于def函數(shù)塊。也就是說整個def函數(shù)塊沒有return,也就沒有出口,自然不會有數(shù)據(jù)出去,所以得到None,將程序改變一下:
def add(sum,x,y):
if sum<10:
x +=2
y +=2
sum=x+y
sum=add(sum,x,y)
return sum
else:
sum=x+y
print (sum)
return sum
print (add(0,0,0))
這次就正確了,程序多次遞歸后,運(yùn)行到else,此時返回一個值到達(dá)sum=add(sum,x,y)的sum,再return sum,此時為def函數(shù)塊的返回值。而之前程序運(yùn)行到sum=add(sum,x,y)時由于等號右邊的遞歸使得程序一直在計算,sum并未被賦值,進(jìn)而下面的
return sum并未執(zhí)行,所以只有一個返回值。