霸王龍不只會php3
2016-05-26 20:44:31
?(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
提交
取消