- 论坛徽章:
- 0
|
之前因为原来养成不良编码风格的原因, 初学PYTHON想试试它的递归, 就用最简单的阶乘来试, 结果出了问题, 还以为PYTHON的递归有什么特别的东西, 今天再试了一试, 终于发现为什么错了, 把过程发出来, 让某些有同样经历的人(也许再没人会发生这种情况)引以为JIAN:
首先看PERL里面求阶乘的例子:
- sub fact{
- my $n = $_[0];
- if($n>1) { #可写为:
- $n = $n * fact($n-1) ; # $n *= fact($n-1) if $n > 1;
- }else{ #
- return $n; # return $n;
- } #但以前受C的影响, 所以那样写了
- }
- print fact(50);
复制代码
这样成功了, 在IF中不用返回, 因为它一定会返回值!
下面用PYTHON依葫芦画瓢来写一个最简单的例子:
- -----------------------------------------------------
- >>> def fact(n):
- ... if n>1:
- ... n = n* fact(n-1);
- ... else:
- ... return n
- ...
- >>> fact(10)
- Traceback (most recent call last):
- File "<stdin>", line 1, in <module>
- File "<stdin>", line 3, in fact
- File "<stdin>", line 3, in fact
- File "<stdin>", line 3, in fact
- File "<stdin>", line 3, in fact
- File "<stdin>", line 3, in fact
- File "<stdin>", line 3, in fact
- File "<stdin>", line 3, in fact
- File "<stdin>", line 3, in fact
- TypeError: unsupported operand type(s) for *: 'int' and 'NoneType'
- -----------------------------------------------------
复制代码
HOHO!出错了, 说fact是NONE类型的, 不能返回给INT类型
WA-KAO! 我明明是返回了值的呀, 怎么会说是NONE型呢?
于是我脑子一转: 莫非是每个逻辑路都要有返回值? 于是修改:
- -----------------------------------------------------
- >>> def fact(n):
- ... if n>1:
- ... n = n* fact(n-1);
- ... return n
- ... else:
- ... return n
- ...
- >>> fact(5)
- 120
- -----------------------------------------------------
复制代码
OK! 成功了, 于是猜想PYTHON是编译时就检查它每条逻辑路的返回值,
如果发现某条逻辑分支没返回, 而最后也没返回的话, 就是NONE型.
到底是不是呢? 为了证实, 我再改进一下, 不在分支返回,
而在最后返回, 试试看:
- -----------------------------------------------------
- >>> def fact(n):
- ... if n>1:
- ... n = n * fact(n-1)
- ... return n
- ...
- >>> fact(5)
- 120
- -----------------------------------------------------
复制代码
YAHOO! 明白了, 真的是PYTHON在编译时会看是不是绝
对有返回, 如果出现意外会不能返回的话就说你是NONE型.
看来MUTI-RETURN(多个RETURN分支)的编程风格真的不好!
JAVA里反对MUTI-RETURN, 现在PYTHON也不喜欢MUTI-RETURN!
那以后写程序最好还是在最后返回算了! |
|