我有一個程序行爲更改相關的問題 返回聲明導致在python方法中。python方法在沒有return語句中的行爲
count下面的方法打印給定整數中的位數。 用下面的代碼塊我得到的結果爲4,這是 預期的結果。
def count(x,acc=0):
if x==0:
return acc
return count(x/10,acc+1)
print "Count is %s" %(count(1234))
結果:計數爲4
如果我修改了上面的方法,使最後的語句不包含 的「return」語句的結果我得到的是「無」。
def count(x,acc=0):
if x==0:
return acc
count(x/10,acc+1)
print "Count is %s" %(count(1234))
結果:計數不是
(Python中的我使用的版本是:2.7.3)
請問上述行爲結果由於是Python並不做尾部呼叫優化還是還有其他推理嗎?
perl中的類似代碼塊(AFAIK不會執行尾部調用優化)提供了 預期結果,而'return'不是最後一條語句的一部分。
sub counter {
my ($n,$acc) = @_;
return $acc if ($n==0);
counter(int($n/10), $acc+1);
}
print "Count is:" . counter(1234,0) ."\n"
結果:Count是:4
(Perl中的我上面的代碼塊跑的版本是:5.14.4和5.8.5)。
我的問題是:
- 是尾部調用優化在Python代碼塊上面顯示的行爲的原因。
- 如果是這種情況,那麼爲什麼perl代碼的行爲會有所不同,這也不會造成TCO。
另請參閱http://stackoverflow.com/questions/17778372/why-does-my-python-function-return-none – devnull
也http://stackoverflow.com/questions/15788969/python-function-always-returns-none – devnull
一個更好的比喻可能是,如果Python在沒有顯式返回語句的情況下到達函數的末尾,就好像你沒有參數就「返回」。因此,你正在返回,但沒有指定返回值(返回None)。 – sabbahillel