今天在弄个人语法分析器的时候,为了观察结果,我想找一个压平嵌套列表的函数(我写了个可是不太满意,记得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)