一行 Python 代码写阶乘函数


背景

我以前用 Dart 写过一行的阶乘函数:

fact(double n) => n < 0 ? throw ('n must be bigger than 0') : n == 0 ? 1 : n * fact(n - 1);

现在突(xián)发(zhe)奇(méi)想(shì),用 Python 写。貌似网上还没有这样的例子,所以我就发出来了。

要求

使用一行代码编写函数。

调用方式为 fact(x),其中 x 为要求阶乘的数。

不得使用分号以变相凑成一行。

解法

如果参数均为合法的,如下:

fact = lambda x : 1 if x == 1 or x == 0 else x * fact(x - 1)

如果加上对输入的检查,则如下(虽然很困难但是还是能够实现的):

fact = lambda x : 1 if x == 1 or x == 0 else (x * fact(x - 1) if isinstance(x, int) and x > 0 else (_ for _ in ()).throw(ValueError('Illegal parameter')))

这时如果参数小于 0 或非整数,就会报错。

上面两个例子中,fact = lambda x : 部分可替换为 def fact(x): return,但是长度变长了。

我也不知道这有什么意思,纯粹为了好玩、挑战自己罢了,实际应用中这样的写法非常影响阅读和理解。毕竟代码是为人服务的,易读易理解才是高级语言编写的初衷。

而且,这样的代码在执行速度上,也不见得能比常规的写法提高不少。

我之前看到有许多用一行代码实现功能的案例,虽说只有一行,但是内容和上面的一样冗长不堪。更让人匪夷所思的是,居然还有人说这体现了这种语言的“高效”……

(顺便说一句,我之前查我的代码有没有先例,看到了这个,不过不符合要求)

我以前也说过,许多培训班的文章或视频,号称几十行代码就能实现某个非常厉害的功能,实际上就是拿各种库拼凑起来的东西,在那几十行背后,是其他不知多少人无私的无法计量的努力。而这些营销号却对他们的努力闭口不谈,无限夸大这门语言(指 Python)的功效,实属恶劣。

声明:阿啊阿吖丁|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - 一行 Python 代码写阶乘函数


这句话一共有五十四笔