今天在弄個人語法分析器的時候,爲了觀察結果,我想找一個壓平嵌套列表的函數(我寫了個可是不太滿意,記得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)