亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

求python大神解析匿名函數 (lambda n,s=lambda n,f:1 if n<2 else f(n-1,f)*n:s(n,s))(10)

求python大神解析匿名函數 (lambda n,s=lambda n,f:1 if n<2 else f(n-1,f)*n:s(n,s))(10)

霸王龍不只會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)


最后, 理解與否這個表達式不重要, 也不建議用這種寫法和思路去 編程,畢竟編程不是一個人的事兒, 每個人寫的代碼都是 同事之間的 交流語言,如果有的人晦澀難懂,溝通合作時就會有很大問題。

查看完整回答
1 反對 回復 2016-05-27
  • 霸王龍不只會php3
    霸王龍不只會php3
    謝謝@清波老師的解答,豁然開朗,在看匿名函數時,看到別人一個這樣的寫法,一時沒想明白提出來大家一塊學習下,最后感謝解惑。
  • 1 回答
  • 1 關注
  • 2744 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號