[Python]使用 lambda 函数

From:http://woodpecker.org.cn/diveintopython/power_of_introspection/lambda_functions.html

4.7. 使用 lambda 函数

  • 4.7.1. 真实世界中的 lambda 函数

Python 支持一种有趣的语法,它允许你快速定义单行的最小函数。这些叫做 lambda 的函数,是从 Lisp 借用来的,可以用在任何需要函数的地方。

例 4.20. lambda 函数介绍

>>> def f(x):
... return x*2
... >>> f(3)
6
>>> g = lambda x: x*2 1
>>> g(3)
6
>>> (lambda x: x*2)(3) 2
6
1这是一个 lambda 函数,完成同上面普通函数相同的事情。注意这里的简短的语法:在参数列表周围没有括号,而且忽略了return 关键字 (隐含存在,因为整个函数只有一行)。而且,该函数没有函数名称,但是可以将它赋值给一个变量进行调用。
2使用 lambda 函数时甚至不需要将它赋值给一个变量。这可能不是世上最有用的东西,它只是展示了lambda 函数只是一个内联函数。

总的来说,lambda 函数可以接收任意多个参数 (包括可选参数) 并且返回单个表达式的值。lambda 函数不能包含命令,包含的表达式不能超过一个。不要试图向lambda 函数中塞入太多的东西;如果你需要更复杂的东西,应该定义一个普通函数,然后想让它多长就多长。

注意
lambda 函数是一种风格问题。不一定非要使用它们;任何能够使用它们的地方,都可以定义一个单独的普通函数来进行替换。我将它们用在需要封装特殊的、非重用代码上,避免令我的代码充斥着大量单行函数。

4.7.1. 真实世界中的 lambda 函数

apihelper.py 中的 lambda 函数:

    processFunc = collapse and (lambda s: " ".join(s.split())) or (lambda s: s)

注意这里使用了 and-or 技巧的简单形式,它是没问题的,因为 lambda 函数在布尔环境中总是为真。(这并不意味这lambda 函数不能返回假值。这个函数对象的布尔值为真;它的返回值可以是任何东西。)

还要注意的是使用了没有参数的 split 函数。你已经看到过它带一个或者两个参数的使用,但是不带参数它按空白进行分割。

例 4.21. split 不带参数

>>> s = "this   is\na\ttest"  1
>>> print s
this is
a test

>>> print s.split() 2
['this', 'is', 'a', 'test']
>>> print " ".join(s.split()) 3
'this is a test'
1这是一个多行字符串,通过使用转义字符的定义代替了三重引号。\n 是一个回车,\t 是一个制表符。
2不带参数的 split 按照空白进行分割。所以三个空格、一个回车和一个制表符都是一样的。
3通过 split 分割字符串你可以将空格统一化;然后再以单个空格作为分隔符用join 将其重新连接起来。这也就是 info 函数将多行doc string 合并成单行所做的事情。

那么 info 函数到底用这些 lambda 函数、split 函数和and-or 技巧做了些什么呢?

    processFunc = collapse and (lambda s: " ".join(s.split())) or (lambda s: s)

processFunc 现在是一个函数,但是它到底是哪一个函数还要取决于 collapse 变量。如果 collapse 为真,processFunc(string) 将压缩空白;否则processFunc(string) 将返回未改变的参数。

在一个不很健壮的语言中实现它,像 Visual Basic,你很有可能要创建一个函数,接受一个字符串参数和一个collapse 参数,并使用 if 语句确定是否压缩空白,然后再返回相应的值。这种方式是低效的,因为函数可能需要处理每一种可能的情况。每次你调用它,它将不得不在给出你所想要的东西之前,判断是否要压缩空白。在Python 中,你可以将决策逻辑拿到函数外面,而定义一个裁减过的 lambda 函数提供确切的 (唯一的) 你想要的。这种方式更为高效、更为优雅,而且很少引起那些令人讨厌 (哦,想到那些参数就头昏) 的错误。

lambda 函数进一步阅读

  • Python Knowledge Base 讨论了使用lambda 来间接调用函数。
  • Python Tutorial 演示了如何从一个lambda 函数内部访问外部变量。(PEP 227 解释了在Python 的未来版本中将如何变化。)
  • The Whole Python FAQ 有关于令人模糊的使用lambda 单行语句的例子。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/406068.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

日志处理(二) 日志组件logback的介绍及配置使用方法(转)

本文转自:http://www.cnblogs.com/yuanermen/archive/2012/02/13/2348942.html http://www.cnblogs.com/yuanermen/archive/2012/02/13/2349609.html 一、logback的介绍 Logback是由log4j创始人设计的又一个开源日志组件。logback当前分成三个模块:logba…

python package安装包_安装Python包(第三方库)

检查python版本如果“提示 python 不是内部或外部命令,也不是可运行的程序或批处理文件。”,可能有2种原因1、进入的目录不对 (切换目录后再查看)C:\Users\zhangXXXX>pythonpython 不是内部或外部命令,也不是可运行的程序或批处理文件。C:…

Windows2003+SQL2000的集群安装手册

1 集群服务器安装及配置 步骤节点1节点2存储注释安装配置系统上电上电断电检查所有共享总线上的存储设备是否都已经断电,给各节点上电。1.1 安装Windows Server 2003操作系统 在服务器1和服务器2分别独立安装Windows Server 2003操作系统。安装要开始安装过程&#…

Bash中执行存储过程或普通的SQL命令

演示: 在bash中执行一个存储过程和一个普通的SQL语句 0. 前提条件: 数据库:Oracle10g 表:oracle自带的emp表,默认有数据如下: 1. 在bash中执行oracle存储过程 首先,在oracle中建立一个存储过…

“AS3.0高级动画编程”学习:第二章转向行为(下)

在上一篇里,我们学习了“自主角色”的一些基本行为:寻找(seek)、避开(flee)、到达(arrive)、追捕(pursue)、躲避(evade)、漫游(wander)。这一篇将继续学习其它更复杂,更高级的行为。 一、对象回避(object avoidance) 对象回避的正式解释为&am…

solor mysql_solr 同步 mysql

一、首先创建一个数据库和表这里创建了一个表,加上了测试数据,注意这里有一个字段来记录更新时间 update_date二、修改配置文件我们首先介绍全量同步,再介绍增量同步我的 solr 版本是 7.5 的,new_core是我创建的 core&#xff0c…

java canvas 缩放图片_详解如何用HTML5 Canvas API控制图片的缩放变换

摘要:这篇HTML5栏目下的“详解如何用HTML5 Canvas API控制图片的缩放变换”,介绍的技术点是“html5_canvas、canvas、Html5、控制图片、api、图片”,希望对大家开发技术学习和问题解决有帮助。缩放变换scale(sx,sy)传入两个参数,分…

向周鸿祎的360安全浏览器学互联网产品运营和推广

做互联网产品运营就要像周鸿祎一样,老周一直是运营流的大力倡导者,而360安全浏览器则是老周给我们上的产品运营又一课,醍醐灌顶,如梦初醒。 下图是截止到今年6月中国网民的浏览器使用情况图: 根据CNZZ的数据&#xff0…

java中的locksupport_java中线程的停止以及LockSupport工具类

看jstack输出的时候,可以发现很多状态都是TIMED_WAITING(parking),如下所示:"http-bio-8080-exec-16" #70 daemon prio5 os_prio0 tid0x00007f6088027800 nid0x3a1f waiting on condition [0x00007f60fcd03000]java.lang.Thread.St…

深入react技术栈(8):事件系统

我是歌谣 放弃很容易 但是坚持一定很酷 微信公众号搜索前端小歌谣获取前端知识 1合成事件的绑定方式 2合成事件的实现机制 3在React中使用原生事件 4合成事件和原生事件混用 5对比react与原生事件 文章参考深入React技术栈

java mac jconsole_解决java maven项目找不到jconsole-1.8.0.jar和tools-1.8.0.jar包问题

今天遇到了这样一种情况,自己的maven项目中并没有引用的jar包出现在了Maven Dependencies的依赖包中。而我在pom.xml自己没有没有引入啊.图示怀疑是自己的alibaba 的druid所依赖的包:com.alibabadruid1.0.14然后查看了它的相关依赖,果然找到了…

PyRun_SimpleString的无穷怨念

From: http://blog.csdn.net/ccat/article/details/544491 好吧,我承认我是个菜鸟,所以今天我勇敢的站出来接受大家的鄙视…… 话说早上同事喊我帮他改段程序,很简单,就是用PyRun_SimpleString函数执行一段Python脚本。错误也很直…