(lambda n,s=lambda n,f:1 if n<2 else f(n-1,f)*n:s(n,s))(10)
1 回答
已采纳
清波
TA贡献165条经验 获得超90个赞
(lambda n,s=lambda n,f:1 if n<2 else f(n-1,f)*n:s(n,s))(10)
谢邀。
用这么 没有可读性的写法,写一个阶乘的递归实现,当真是无聊; 不是在为难读者,就是单纯的为了玩玩匿名函数,也许两者皆有吧。
解起来也不容易。。。
##匿名函数的自调用 lambda x: x+1 ## 这是一个匿名函数,它其实就是函数体本身 a = lambda x: x+1 ## 将这个匿名函数赋值给 一个变量名,那么这个匿名函数 基本就是具名函数了。 print a(11) ## 打印调用a 的结果 12 print (lambda x: x+1)(11) ## 这个跟 print a(11) 是一样的 12
至此我们就明白了 Python 匿名函数的 自调用看起来跟 JS 的差不多。 那么上面的表达式就可以进行第一步解构了,它有两部分组成:
(lambda n,s=lambda n,f:1 if n<2 else f(n-1,f)*n:s(n,s))(10) ## 原表达式 lambda n,s=lambda n,f:1 if n<2 else f(n-1,f)*n:s(n,s) ## 第一部分, 匿名函数 (10) ## 第二部分,传的实参 10
接下来就是 接着 解构 第一部分:
首先,这个表达式 可以分成两个部分,但是由于是 递归写法 所以单独拆开来,看着就有问题,我们试着拆一下:
lambda n, s=lambda n,f:1 if n<2 else f(n-1,f)*n: s(n,s)
将加粗的部分看成是一个 keyword argument(关键字参数), 那么这个函数的简化体如下:
lambda n, s=lambda n,f:1 if n<2 else f(n-1,f)*n: s(n,s) ## 匿名函数 s = lambda n,f: 1 if n<2 else f(n-1,f)*n ## 匿名函数关键字参数 s lamda n, s: s(n,s) ## 简化后的函数体
至此,也没有需要再 结构的了, 关键字参数 s 返回的结果是一个 Python 版 的三元表达式 且里面递归调用了本身,但是 上面的分开 的写法,下面的函数时调用不到 s的,必须像 题主的问题中那样 组合在一起。 或者 如下这么写:
s = lambda n,f: 1 if n<2 else f(n-1,f)*n print s(10,s)
最后, 理解与否这个表达式不重要, 也不建议用这种写法和思路去 编程,毕竟编程不是一个人的事儿, 每个人写的代码都是 同事之间的 交流语言,如果有的人晦涩难懂,沟通合作时就会有很大问题。
添加回答
举报
0/150
提交
取消