Python interview - lambda

Python 中的lambda函数也叫匿名函数,即,没有具体的名称。lambda的主题是一个表达式,而不是一个代码块,仅仅能在lambda表达式中封装有限的逻辑。

我们拿正常的定义函数的方式来做比较:

def f(x):
    return x**2

print f(4)

# result

16

用lambda可以这样写:

g = lambda x : x**2
print g(4)

# result

16

对于lambda表达式来说,与普通函数相比,就是省去了函数名称,此外,这样的匿名函数,也不能共享在别的地方调用。简单来说,lambda其实并没有起到很关键的作用,有很多的方法可以代替lambda使用。

最主要的作用:

1. 使用Python写一些执行脚本的时候,可以用lambda省去写定义函数的过程,使得代码更加精简。

2. 对于一些抽象的, 不会用在别的地方重复使用的函数,起名称有一定难度的方法,可以使用lambda不需要考虑命名的问题。

3. 使用lambda某些时候让代码更加容易理解。

4. lambda会创建一个函数对象,但不会把函数对象赋给一个标示符,而定义函数会把函数对象赋值给一个变量。

lambda基础

lambda语句中,冒号前是参数,可以有多个,用逗号隔开,冒号右边是返回值。

g = lambda x : x**2
print g

# result

<function <lambda> at 0x0000000001FA7358>

lambda和def共同使用

def action(x):
    return lambda y: x+y

a = action(2)
print a(22)

# result

24

首先定义了一个action函数,返回一个lambda的表达式。lambda表达式获取到了上层def函数作用域的变量名x的值。

a是action函数的返回值,即,lambda表达式

a(22),即,调用了action的返回lambda表达式

如果全用lambda写的话

b = lambda x: lambda y: x+y
a = b(2)
print a
print a(22)

# result

<function <lambda> at 0x0000000001F673C8>
24

Python中有很多定义好的全局函数可以和lambda配合使用

foo = [2, 18, 9, 22, 17, 24, 8, 12, 27]

print filter(lambda x: x % 3 == 0, foo)

print map(lambda x: x * 2 + 10, foo)

print reduce(lambda x, y: x + y, foo)

# result

[18, 9, 24, 12, 27]
[14, 46, 28, 54, 44, 58, 26, 34, 64]
139

就上述的map的例子,我们并不一定要用lambda,可以写成:

print [x * 2 + 10 for x in foo]

filter的例子可以写成:

print [x for x in foo if x % 3 == 0]

利用了list comprehension比lambda更加容易理解。

lambda中全局变量的概念

创建一个函数数组fs = [f0,...,f9] where fi(n) = i + n, 于是:

fs = [(lambda n: i + n) for i in range(10)]

但是,并没有得到想要的结果:

>>> fs[3](4) # 应该是7
13
>>> fs[4](4) # 8
13
>>> fs[5](4) # 9
13

给返回的lambda表达式传入4,得到的结果都是13,那么推断lambda表达式为 lambda n: 9 + n,问题出在了i上面。

不用lambda的代码版本应该如下:

i = 1
def fs(n):
    return n + i
print fs(1) # 2

i = 2
print fs(1) # 3

这里i是一个全局变量,所以我们需要修改最开始的代码,让lambda表达式中的i是全局变量。

fs = [(lambda n, i=i : i + n) for i in range(10)]
>>> fs[3](4)
7
>>> fs[4](4)
8
>>> fs[5](4)
9

参考:

http://blog.csdn.net/xiaobei4929/article/details/10530723

http://www.cnblogs.com/qq78292959/archive/2013/05/07/3064438.html

http://math.andrej.com/2009/04/09/pythons-lambda-is-broken/

http://www.secnetix.de/olli/Python/lambda_functions.hawk

时间: 2024-08-26 12:36:39

Python interview - lambda的相关文章

Python的lambda函数与排序

Python的lambda函数与排序 2010-03-02 15:02 2809人阅读 评论(0) 收藏 举报 lambdapythonlistlispclass工作 目录(?)[+] 前几天看到了一行求1000的阶乘的Python代码: print    reduce ( lambda    x , y : x * y ,    range ( 1 ,    1001 )) 一下子被python代码的精简 与紧凑所折服,故对代码进行了简单的分析. reduce与range都是Python的内置

python 使用lambda函数 和 list comprehension

python 使用lambda函数 学习资源 lambda函数学习 list comprehension 多维数组初始化 lambda 函数 Python 支持一种有趣的语法,它允许你快速定义单行的最小函数.这些叫做 lambda 的函数,是从 Lisp 借用来的,可以用在任何需要函数的地方. def f(x): return x*2,用lambda函数来替换可以写成:g = lambda x: x*2`g(3)结果是6.(lambda x: x*2)(3)`也是同样的效果. 这是一个 lamb

python中lambda

lambda_expr ::= "lambda" [parameter_list]: expression python中lambda可以理解为一个匿名函数,它的要求是函数的运算部分只能是一个表达式,参数部分可以有多个参数

python中lambda的另类使用

Lambda挺强大,有兴趣的人看下关于lambda的理论,就清楚邱奇编码的实现了. 网上的都只是讲的千篇一律的匿名函数的简单用法,很没趣. 那些建议取消python中lambda的同志,知道lambda可以这么用么. 带if/else: ( lambda x, y: x if x < y else y )( 1, 2 ) 科里化: ( lambda x: ( lambda y: ( lambda z: x + y + z )( 1 ) )( 2 ) )( 3 ) 递归: func = lambd

细说Python的lambda函数用法,建议收藏

细说Python的lambda函数用法,建议收藏 在Python中有两种函数,一种是def定义的函数,另一种是lambda函数,也就是大家常说的匿名函数.今天我就和大家聊聊lambda函数,在Python编程中,大家习惯将其称为表达式. 1.为什么要用lambda函数? 先举一个例子:将一个列表里的每个元素都平方. 先用def来定义函数,代码如下 def sq(x): return x*x map(sq,[y for y in range(10)]) 再用lambda函数来编写代码 map(la

python zip,lambda,map函数

python zip,lambda,map函数 觉得有用的话,欢迎一起讨论相互学习~Follow Me 感谢莫烦老师 详情 zip 通常用于将两个列表合并在一起以同时进行迭代遍历 注意:直接使用zip输出结果为<zip at 0x1d72cf30bc8>,要配合list一起使用 a = [1, 2, 3] b = [4, 5, 6] zip(a,b) # <zip at 0x1d72cf30bc8> print(list(zip(a, b))) # [(1, 4), (2, 5),

Python的lambda匿名函数

lambda函数也叫匿名函数,即,函数没有具体的名称.先来看一个最简单例子: def f(x):return x**2print f(4) Python中使用lambda的话,写成这样 g = lambda x : x**2print g(4) lambda表达式在很多编程语言都有对应的实现.比如C#: var g = x => x**2Console.WriteLine(g(4)) 那么,lambda表达式有什么用处呢?很多人提出了质疑,lambda和普通的函数相比,就是省去了函数名称而已,同

Python的lambda, filter, reduce 和 map简介

Lambda 操作 Lambda操作——有些人喜欢,有些人讨厌,还有很多人害怕.当你看完了我们这章的介绍后,我们很自信你会喜欢上它.要不然,你可以去学习Guido van Rossums更喜欢去用的“list comprehensions”(递推式构造列表)了,因为他也不喜欢Lambda, map filter 和reduce. Lambda操作或者lambda函数是一种创建小型匿名函数的方式,即:函数都没有函数名.这些函数都是投掷(throw-away)函数,即:它们只会在我们需要的地方创建,

python之lambda,filter,map,reduce函数

g = lambda x:x+1 看一下执行的结果: g(1) >>>2 g(2) >>>3 当然,你也可以这样使用: lambda x:x+1(1) >>>2 可以这样认为,lambda作为一个表达式,定义了一个匿名函数,上例的代码x为入口参数,x+1为函数体,用函数来表示为: def g(x): return x+1 非常容易理解,在这里lambda简化了函数定义的书写形式.是代码更为简洁,但是使用函数的定义方式更为直观,易理解. Python中,