一行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)的功效,实属恶劣。


文章作者: 丁俊尧
版权声明: 本博客所有文章除特別声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 丁俊尧 !
  目录