lambda函数也叫匿名函数,即,函数没有具体的名称。先来看一个最简单例子:
- def f(x):
- return x**2
- print f(4)
- g = lambda x : x**2
- print g(4)
- var g = x => x**2
- Console.WriteLine(g(4))
- g = lambda x : x**2
- print g
- <function <lambda> at 0x00AFAAF0>
- var array = new int[] { 2, 3, 5, 7, 9};
- var result = array.Where(n => n > 3); // [5, 6, 9]
- >>> foo = [2, 18, 9, 22, 17, 24, 8, 12, 27]
- >>>
- >>> print filter(lambda x: x % 3 == 0, foo)
- [18, 9, 24, 12, 27]
- >>>
- >>> print map(lambda x: x * 2 + 10, foo)
- [14, 46, 28, 54, 44, 58, 26, 34, 64]
- >>>
- >>> print reduce(lambda x, y: x + y, foo)
- 139
print [x * 2 + 10 for x in foo]
非常的简洁,易懂。filter的例子可以写成:print [x for x in foo if x % 3 == 0]
同样也是比lambda的方式更容易理解。 所以,什么时候使用lambda,什么时候不用,需要具体情况具体分析,只要表达的意图清晰就好。一般情况下,如果for..in..if能做的,我都不会选择lambda。 lambda broken? 在数学教学中,经常会使用到lambda,比如有一位老兄就遇到这样一个问题。他想创建一个函数数组fs=[f0,...,f9] where fi(n)=i+n. 于是乎,就定义了这么一个lambda函数:fs = [(lambda n: i + n) for i in range(10)]
但是,奇怪的是: - >>> fs[3](4)
- 13
- >>> fs[4](4)
- 13
- >>> fs[5](4)
- 13
- >>> fs[3](4)
- 7
- >>> fs[4](4)
- 8
- >>> fs[5](4)
- 9
- i = 1
- def fs(n):
- return n + i
- print fs(1) # 2
- i = 2
- print fs(1) # 3
- fs = [(lambda n, i=i : i + n) for i in range(10)]
- >>> fs[3](4)
- 7
- >>> fs[4](4)
- 8
- >>> fs[5](4)
- 9