设为首页收藏本站

Crossin的编程教室

 找回密码
 立即加入
查看: 39150|回复: 26
打印 上一主题 下一主题

【Python 第70课】lambda 表达式

[复制链接]

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

跳转到指定楼层
楼主
发表于 2014-6-11 15:25:49 |只看该作者 |倒序浏览


Python 是一门简洁的语言,lambda 表达式则充分体现了 Python 这一特点。

lambda 表达可以被看做是一种匿名函数。它可以让你快速定义一个极度简单的单行函数。譬如这样一个实现三个数相加的函数:

def sum(a, b, c):
   return a + b + c

print sum(1, 2, 3)
print sum(4, 5, 6)

输出:
6
15

如果使用 lambda 表达式来实现:

sum = lambda a, b, c: a + b + c

print sum(1, 2, 3)
print sum(4, 5, 6)

输出:
6
15

两种方法的结果是相同的。

lambda 表达式的语法格式:

lambda 参数列表: 表达式

定义 lambda 表达式时,参数列表周围没有括号,返回值前没有 return 关键字,也没有函数名称。

它的写法比 def 更加简洁。但是,它的主体只能是一个表达式,不可以是代码块,甚至不能是命令(print 不能用在 lambda 表达式中)。所以 lambda 表达式能表达的逻辑很有限。

lambda 表达式创建了一个函数对象,可以把这个对象赋值给一个变量进行调用,就像上面的例子中一样。


来看一个复杂一点的例子,把 lambda 表达式用在 def 函数定义中:

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

a = fn(2)
print a(3)

输出:
5

这里,fn 函数的返回值是一个 lambda 表达式,也就等于是一个函数对象。当以参数2来调用 fn 时,得到的结果就是:
lambda y: 2 + y

a = fn(2) 就相当于:
a = lambda y: 2 + y

所以 a(3) 的结果就是5。


lambda 表达式其实只是一种编码风格,这种写法更加 pythonic。这并不意味着你一定要使用它。事实上,任何可以使用 lambda 表达式的地方,都可以通过普通的 def 函数定义来替代。在一些需要重复使用同一函数的地方,def 可以避免重复定义函数。况且 def 函数更加通用,某些情况可以带来更好地代码可读性。

而对于像 filter、sort 这种需要内嵌函数的方法,lambda 表达式就会显得比较合适。这个我以后会再单独介绍。

当然对于初学者来说,了解 lambda 表达式还有一个重要作用就是,看懂别人写的代码。

#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

0

好友

53

积分

注册会员

Rank: 2

沙发
发表于 2014-9-24 00:12:36 |只看该作者

回帖奖励 +7

这个lambda表达式的作用应该是和C语言中的define一样吧
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

板凳
发表于 2014-9-24 10:52:33 |只看该作者
lovingyun 发表于 2014-9-24 00:12
这个lambda表达式的作用应该是和C语言中的define一样吧

有点类似,但不完全一样
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

0

好友

558

积分

高级会员

Rank: 4

地板
发表于 2014-9-27 00:47:33 |只看该作者

回帖奖励 +7

有点意思,看看。
学习,纯粹。
回复

使用道具 举报

0

主题

0

好友

558

积分

高级会员

Rank: 4

5#
发表于 2014-9-30 00:20:15 |只看该作者
先生,“而对于像 filter、sort 这种需要内嵌函数的方法,lambda 表达式就会显得比较合适。这个我以后会再单独介绍。”
学习,纯粹。
回复

使用道具 举报

0

主题

0

好友

72

积分

注册会员

Rank: 2

6#
发表于 2015-3-31 22:18:40 |只看该作者

回帖奖励 +7

又来学习
回复

使用道具 举报

0

主题

0

好友

47

积分

新手上路

Rank: 1

7#
发表于 2015-4-14 14:59:48 |只看该作者

回帖奖励 +7

了解 lambda 表达式还有一个重要作用就是,看懂别人写的代码。
这句话。。。。
回复

使用道具 举报

0

主题

0

好友

215

积分

中级会员

Rank: 3Rank: 3

8#
发表于 2015-4-22 15:38:48 |只看该作者

回帖奖励 +7

该用户从未签到
回复

使用道具 举报

0

主题

0

好友

41

积分

新手上路

Rank: 1

9#
发表于 2015-12-9 16:57:27 |只看该作者

回帖奖励 +7

请问先生a = fn(2)这句是不是相当于把lambda的函数名定义为a,这样下一步a(3)就直接调用lambda了?
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

10#
发表于 2015-12-9 21:19:20 |只看该作者
hanxuejiao 发表于 2015-12-9 16:57
请问先生a = fn(2)这句是不是相当于把lambda的函数名定义为a,这样下一步a(3)就直接调用lambda了? ...

不仅仅是名称,同时设定了x的值为2
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即加入

QQ|手机版|Archiver|Crossin的编程教室 ( 苏ICP备15063769号  

GMT+8, 2024-11-22 10:29 , Processed in 0.018024 second(s), 25 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部