取代python的 and or 的x if y else z方法,補充匿名遞歸方法

今天在弄個人語法分析器的時候,爲了觀察結果,我想找一個壓平嵌套列表的函數(我寫了個可是不太滿意,記得cnblogs有看到過),因而搜了一下,找到了這篇文章: html

http://www.cnblogs.com/c-hy/archive/2012/09/21/2696703.html python

裏面的lambda函數讓我很滿意,可是有個用法確實第一次見,函數以下: 函數

flat=lambda L: sum(map(flat,L),[]) if isinstance(L,list) else [L,]
注意裏面的一個用法, x if y else z

這個用法的效果是,若是y真,返回x,不然返回z。 spa

並且這個用法是表達式,不是語句! code

能夠算是一個語法糖,從上面能夠看到,經過賦值lambda實現了遞歸(一次能夠實現變向的循環),經過這個語法糖又實現了選擇,所以極大加強了lambda的威力。惋惜就是不賦值的話,仍是實現不了遞歸,但願可以有所改進,可是如今已經很接近lisp的表達能力了。 htm

這個用法是表達式,並不侷限與lambda語句內的。 blog

所以咱們能夠這樣寫: 遞歸

x=3*4/7
y='a'
z='b'
t=y if int(x) else z

最後提供兩個lambda函數: get

#解包函數,將遞歸的解包,直到參數是原子或者長度大於1的列表
wrap=lambda L: tuple(wrap(list(L))) if isinstance(L,tuple) else L if not isinstance(L,list) else map(wrap,L) if len(L)>1 else wrap(L[0])
#壓平列表,對元組也會進行壓平,但仍返回元組
flat=lambda L: sum(map(flat,L),[]) if isinstance(L,list) else [tuple(flat(list(L))),] if isinstance(L,tuple) else [L,]

ps:我才意識到,python的while、for、try也能夠接else子句,受教育了 class

補充,lambda的匿名遞歸方法,lambda也能夠實現遞歸的,方法是利用參數默認值來實現賦值的命名操做,從而保證函數的匿名性。

(lambda n,s=lambda n,f:1 if n<2 else f(n-1,f)*n:s(n,s))(10)
相關文章
相關標籤/搜索