背景
我以前用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 : 1if x == 1or x == 0else x * fact(x - 1)
如果加上对输入的检查,则如下(虽然很困难但是还是能够实现的):
fact = lambda x : 1if x == 1or x == 0else (x * fact(x - 1) if isinstance(x, int) and x > 0else (_ for _ in ()).throw(ValueError('Illegal parameter')))
这时如果参数小于0或非整数,就会报错。
附
上面两个例子中,fact = lambda x :部分可替换为def fact(x): return,但是长度变长了。
我也不知道这有什么意思,纯粹为了好玩、挑战自己罢了,实际应用中这样的写法非常影响阅读和理解。毕竟代码是为人服务的,易读易理解才是高级语言编写的初衷。
而且,这样的代码在执行速度上,也不见得能比常规的写法提高不少。
我之前看到有许多用一行代码实现功能的案例,虽说只有一行,但是内容和上面的一样冗长不堪。更让人匪夷所思的是,居然还有人说这体现了这种语言的“高效”……
这括号看得我头疼
(顺便说一句,我之前查我的代码有没有先例,看到了这个,不过不符合要求)
我以前的文章(厉害的不是Python,是库)也说过,许多培训班的文章或视频,号称几十行代码就能实现某个非常厉害的功能,实际上就是拿各种库拼凑起来的东西,在那几十行背后,是其他不知多少人无私的无法计量的努力。而这些营销号却对他们的努力闭口不谈,无限夸大这门语言(指Python)的功效,实属恶劣。