[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,一经查实,立即删除!

相关文章

mysql修改子分区_创建MySQL子分区方法

创建MySQL子分区方法发布时间:2020-05-26 15:11:15来源:51CTO阅读:216作者:三月本文主要给大家介绍创建MySQL子分区方法,文章内容都是笔者用心摘选和编辑的,具有一定的针对性,对大家的参考意义还…

const char * array[]和char * const array[]

int main() {char abc[] "abc";char def[] "def";char * const array[] {"abc", "def"};char * const array2[] {abc, def};const char * array3[3] {"abc", "def"};//char * const array3[2]; //error,定义…

日志处理(二) 日志组件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…

TNS-03505 oracle用户可以tnsping通,普通用户tnsping报错

From: http://zxf261.blog.51cto.com/701797/750308 今天碰到了一个有趣的问题 oracle用户可以tnsping通&#xff0c;普通用户tnsping报错 用普通用户tnsping数据库的时候报 TNS-03505: Failed to resolve name 而用oracle用户tnsping数据库的时候却可以ping通 <34 linux-si…

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

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

Windows2003+SQL2000的集群安装手册

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

wpf全局异常

在App.xaml文件中 添加DispatcherUnhandledExceptionEventArgs 新增对应事件 转载于:https://www.cnblogs.com/ChenRihe/p/4421049.html

shell执行oracle存储过程,获得存储过程返回值

From: http://www.flatws.cn/article/program/oracle/2011-06-27/32316.html 同事做一个小的etl调度&#xff0c;需要将存储过程执行情况进行返回并控制其后续依赖是否执行&#xff0c;本人只是将调用执行存储过程的shell脚本中存储过程输出参数返回&#xff0c;并没有写具体的…

一群人围成一圈从123报数,如果报到3就退出该圈中,直到最后一个人留下来!...

package com.pb.demo1;import java.util.ArrayList; import java.util.List; import java.util.Scanner; import java.util.regex.Matcher; import java.util.regex.Pattern;/*** 一群人围成一圈从123报数&#xff0c;如果报到3就退出该圈中&#xff0c;直到最后一个人留下来&a…

动画基础01

在silverlight动画中&#xff0c;动画类型被分为两类&#xff1a;From/To/By&#xff08;线性插值动画&#xff08;Linear Interpolation&#xff09;和关键帧动画 &#xff08;Key-frame Animation&#xff09;。 1.From/To/By 动画&#xff0c;也称为线性插值动画&#xff08…

async中series的实现 javascript构件

//同步流程 var seriesfunction(arr){function async(i){arr[i](function(){if(1i<arr.length){async(1i)}})}async(0) } //demo var back1function(callback){setTimeout(function(){cc.log(21)callback()},1000) }series([back1,back1,back1])转载于:https://www.cnblogs.…

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

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

用c语言调用动态库

动态加载是在程序运行时用dlopen,dlsym函数进行的。静态加载发生在程序装载时。1.1 用c语言静态方式调用动态库libsthc.so&#xff1a;/** ctest.c* Testing program for libsthc.so library //测试程序为在c语言中调用libsthc.so库* in c languange* */#include "libsth…

hdu3555 Bomb 数位dp

//3555 //题意&#xff1a;统计 1 到 n 中包含 49 的数的个数 1 #include "bits\stdc.h"2 using namespace std;3 __int64 dp[22][3];4 5 int main()6 {7 int i;8 dp[0][0] 1;9 for(i 1; i < 20; i) { 10 dp[i][0] dp[i - 1][0] * 10 - dp…

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

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

ruby scala python_解释一个基准在C,Clojure,Python,Ruby,Scala和其他

免责声明我知道人工基准是邪恶的。它们只能针对非常特定的狭窄情况显示结果。我不认为一种语言比另一种语言更好&#xff0c;因为一些愚蠢的长凳。然而&#xff0c;我不知道为什么结果是如此不同。请在底部查看我的问题。数学基准描述基准是简单的数学计算&#xff0c;找到不同…