一行Python代码写阶乘函数
2019-03-06 本文已影响0人
阿啊阿吖丁
背景
我以前用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
,但是长度变长了。
我也不知道这有什么意思,纯粹为了好玩、挑战自己罢了,实际应用中这样的写法非常影响阅读和理解。毕竟代码是为人服务的,易读易理解才是高级语言编写的初衷。
而且,这样的代码在执行速度上,也不见得能比常规的写法提高不少。
我之前看到有许多用一行代码实现功能的案例,虽说只有一行,但是内容和上面的一样冗长不堪。更让人匪夷所思的是,居然还有人说这体现了这种语言的“高效”……
![](https://img.haomeiwen.com/i1783296/e4207eec3289ea62.png)
(顺便说一句,我之前查我的代码有没有先例,看到了这个,不过不符合要求)
我以前也说过,许多培训班的文章或视频,号称几十行代码就能实现某个非常厉害的功能,实际上就是拿各种库拼凑起来的东西,在那几十行背后,是其他不知多少人无私的无法计量的努力。而这些营销号却对他们的努力闭口不谈,无限夸大这门语言(指Python)的功效,实属恶劣。