Python 匿名函数lambda

 

lambda表达式在“:”后只能有一个表达式。也就是说,在def中,用return可以返回的也可以放在lambda后面,不能用return返回的也不能定义在python lambda后面。因此,像if或for或print这种语句就不能用于lambda中,lambda一般只用来定义简单的函数

Python虽然不是一种函数式编程语言,但仍然给予了函数式编程很大的重视。接下来的几篇文章我将记录一些Python函数式编程的知识,其中本文要说的是匿名函数lambda。

Python使用lambda关键字创造匿名函数。所谓匿名,意即不再使用def语句这样标准的形式定义一个函数。这种语句的目的是由于性能的原因,在调用时绕过函数的栈分配。其语法是:

lambda [arg1[, arg2, ... argN]]: expression

其中,参数是可选的,如果使用参数的话,参数通常也会在表达式之中出现。

下面举例来说明lambda语句的使用方法(无参数)。

Python匿名函数lambda举例(无参数)

 
 
 
 
 

Python

 
1
2
3
4
5
6
7
8
9
10
11
12
# 使用def定义函数的方法
def true():
    return True
 
#等价的lambda表达式
>>> lambda :True
<function <lambda> at 0x0000000001E42518>
 
# 保留lambda对象到变量中,以便随时调用
>>> true = lambda :True
>>> true()
True

下面再举一个带参数的例子。

Python匿名函数lambda举例(含参数)

 
 
 
 
 

Python

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 使用def定义的函数
def add( x, y ):
    return x + y
 
# 使用lambda的表达式
lambda x, y: x + y
 
# lambda也允许有默认值和使用变长参数
lambda x, y = 2: x + y
lambda *z: z
 
# 调用lambda函数
>>> a = lambda x, y: x + y
>>> a( 1, 3 )
4
>>> b = lambda x, y = 2: x + y
>>> b( 1 )
3
>>> b( 1, 3 )
4
>>> c = lambda *z: z
>>> c( 10, 'test')
(10, 'test')

是不是看起来代码更简洁,又不失可读性。

==========================================

**加深对lambda函数的了解**

无参匿名函数:
------
>>> t = lambda : True #分号前无任何参数
>>> t()
True

等价于下面的def定义的函数
>>> def func(): return True
>>> func()
True

------

>>> s = "this is\na\ttest" #建此字符串按照正常情形输出
>>> s
'this is\na\ttest'
>>> print s.split() #split函数默认分割:空格,换行符,TAB
['this', 'is', 'a', 'test']
>>> ' '.join(s.split()) #用join函数转一个列表为字符串
'this is a test'

等价于

>>> (lambda s:' '.join(s.split()))("this is\na\ttest")

带参数匿名函数

>>> lambda x: x**3 #一个参数
>>> lambda x,y,z:x+y+z #多个参数

>>> lambda x,y=3: x*y #允许参数存在默认值

匿名函数调用

#直接赋值给一个变量,然后再像一般函数调用

------

>>> c = lambda x,y,z: x*y*z
>>> c(2,3,4)
24

------

>>> c = lambda x,y=2: x+y #使用了默认值
>>> c(10) #不输的话,使用默认值2
12

------

>>> a = lambda *z:z #*z返回的是一个元祖
>>> a('Testing1','Testing2')
('Testing1', 'Testing2')

------

>>> c = lambda **Arg: Arg #arg返回的是一个字典
>>> c()
{}

#直接后面传递实参

------

>>> (lambda x,y: x if x> y else y)(101,102)
102

------

>>> (lambda x:x**2)(3)
9

#lambda返回的值,结合map,filter,reduce使用

>>> filter(lambda x:x%3==0,[1,2,3,4,5,6])
[3, 6]

等价于下面的列表推导式

>>> l = [x for x in [1,2,3,4,5,6] if x%3==0]
>>> l
[3, 6]

嵌套使用

#lambda嵌套到普通函数中,lambda函数本身做为return的值

------

>>> def increment(n):
... return lambda x: x+n
...
>>> f=increment(4)
>>> f(2)
6

------

>>> def say():
... title = 'Sir,'
... action= lambda x: title + x
... return action
...
>>> act = say()
>>> act('Smith!')
'Sir,Smith!'

大量例子:

例01: 字符串联合,有默认值,也可以x=(lambda...)这种格式

>>> x = (lambda x="Boo",y="Too",z="Zoo": x+y+z)
>>> x("Foo")
'FooTooZoo'

例02: 和列表联合使用

>>> L = [lambda x:x**2,\
lambda x:x**3,\
lambda x:x**4]

>>> for f in L:
... print f(2)
...
4
8
16

也可以如下面这样调用

>>> print L[0](3)
9

例03: 和字典结合使用

>>> key = 'B'
>>> dic = { 'A': lambda: 2*2,\
... 'B': lambda: 2*4,\
... 'C': lambda: 2*8}
>>> dic[key]()
8

例04: 求最小值

>>> lower = lambda x,y: x if x<y else y
>>> lower('aa','ab')
'aa'

例05: 和map及list联合使用

>>> import sys
>>> showall = lambda x:list(map(sys.stdout.write,x))
>>> showall(['Jerry\n','Sherry\n','Alice\n'])
Jerry
Sherry
Alice

>>> showall(['Jerry','Sherry','Alice'])
JerrySherryAlice

等价于下面

>>> showall = lambda x: [sys.stdout.write(line) for line in x]
>>> showall(('I\t','Love\t','You!'))
I Love You![None, None, None]

例06: 在Tkinter中定义内联的callback函数

import sys
from Tkinter import Button,mainloop

x = Button(text='Press me',
command=(lambda:sys.stdout.write('Hello,World\n')))
x.pack()
x.mainloop()

>>>

Hello,World!

Hello,World!

例07: lambda和map联合使用,

>>>  out = lambda *x: sys.stdout.write(' '.join(map(str,x)))
>>> out('This','is','a','book!\n')
This is a book!

例08: 判断字符串是否以某个字母开头

>>> print (lambda x: x.startswith('B'))('Bob')
True

-----

>>> Names = ['Anne', 'Amy', 'Bob', 'David', 'Carrie', 'Barbara', 'Zach']
>>> B_Name= filter(lambda x: x.startswith('B'),Names)
>>> B_Name
['Bob', 'Barbara']

例09: lambda和map联合使用:

>>>  squares = map(lambda x:x**2,range(5))
>>> squares
[0, 1, 4, 9, 16]

例10. lambda和map,filter联合使用:

>>>  squares = map(lambda x:x**2,range(10))
>>> filters = filter(lambda x:x>5 and x<50,squares)
>>> filters
[9, 16, 25, 36, 49]

例11. lambda和sorted联合使用

#按death名单里面,按年龄来排序

#匿名函数的值返回给key,进来排序

>>> death = [ ('James',32),
('Alies',20),
('Wendy',25)]

>>> sorted(death,key=lambda age:age[1]) #按照第二个元素,索引为1排序
[('Alies', 20), ('Wendy', 25), ('James', 32)]

例12. lambda和reduce联合使用

>>> L = [1,2,3,4]
>>> sum = reduce(lambda x,y:x+y,L)
>>> sum
10

例13. 求2-50之间的素数

#素数:只能被1或被自己整除的数

>>> nums = range(2,50)
>>> for i in nums:
nums = filter(lambda x:x==i or x % i,nums)
>>> nums
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47]

例14. 求两个列表元素的和

>>> a = [1,2,3,4]
>>> b = [5,6,7,8]
>>> map(lambda x,y:x+y, a,b)
[6, 8, 10, 12]

例15. 求字符串每个单词的长度

>>> sentence = "Welcome To Beijing!"
>>> words = sentence.split()

>>> lengths = map(lambda x:len(x),words)
>>> lengths
[7, 2, 8]

写成一行:

>>>  print map(lambda x:len(x),'Welcome To Beijing!'.split())

部分参考玩蛇网:http://www.iplaypy.com/wenda/lambda.html

部分参考csdn:http://blog.csdn.net/csdnstudent/article/details/40112803

python之Lambda的更多相关文章

  1. Python中Lambda表达式使用

    软件环境 Python: 2.7.13; win10 Lambda描述 python 使用 lambda 表达式来创建匿名函数 lambda只是一个表达式,函数体比def简单很多 lambda的主体是 ...

  2. Python之 Lambda表达式

    标签(空格分隔): Python进阶 Lambda是一种匿名函数,当我们需要重复调用某一函数,又不想写那么多代码时可以使用lambda表达式来代替. lambda的通用格式: lambda argum ...

  3. Python的lambda函数与排序

    Python的lambda函数与排序 2010-03-02 15:02 2809人阅读 评论(0) 收藏 举报 lambdapythonlistlispclass工作   目录(?)[+]   前几天 ...

  4. python中lambda

    lambda_expr ::= "lambda" [parameter_list]: expression python中lambda可以理解为一个匿名函数,它的要求是函数的运算部 ...

  5. python 之Lambda表达式

    python 的 lambda 表达式 python写一些执行脚本时,使用lambda就可以省下定义函数的过程,比如说我们只是需要写个简单的脚本来管理服务器时,我们就不用专门定义函数然后再写调用,使用 ...

  6. Python之Lambda与三元运算

    Python之Lambda与三元运算 Lambda 运算 概念:是指一类无需定义标识符(函数名)的函数或者子程序.特点:匿名函数不使用def定义函数,使用lambda来创建匿名函数1.lambda只是 ...

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

    细说Python的lambda函数用法,建议收藏 在Python中有两种函数,一种是def定义的函数,另一种是lambda函数,也就是大家常说的匿名函数.今天我就和大家聊聊lambda函数,在Pyth ...

  8. python之lambda,random,timeit,collections,

    python之lambda,random,timeit,collections,一. python之lambda函数lambda函数又称为匿名函数,匿名函数就是没有函数名的函数.>>> ...

  9. Python之lambda表达式的妙用

    用法 Python的lambda表达式用于构建匿名函数,基本语法是在冒号左边放原函数的参数,可以有多个参数,用逗号隔开即可:冒号右边是返回值. >>> lambda x,y: (x+ ...

  10. 14.在Python中lambda函数是什么

    在Python中lambda函数是什么? It is a single expression anoymous function often used as inline function. lamb ...

随机推荐

  1. LeetCode 120. Triangle (三角形最小路径和)详解

    题目详情 给定一个三角形,找出自顶向下的最小路径和.每一步只能移动到下一行中相邻的结点上. 例如,给定三角形: [ [2], [3,4], [6,5,7], [4,1,8,3] ] 自顶向下的最小路径 ...

  2. 解决 EntityFrameworkCore tool 3.1 init.ps1 is not recognized 问题

    昨天将项目升级到.net core 3.1后, 打开vs2019 Package Manager Console后突然发生了错误,如下 最终导致EntityFramework 迁移相关命令都不能正常使 ...

  3. 完了,这个硬件成精了,它竟然绕过了 CPU...

    我们之前了解过了 Linux 的进程和线程.Linux 内存管理,那么下面我们就来认识一下 Linux 中的 I/O 管理. Linux 系统和其他 UNIX 系统一样,IO 管理比较直接和简洁.所有 ...

  4. Windows下make clean指令错误[错误码2](系统找不到指定文件)的解决方案

    问题来源 因为笔者想用GCC编译器进行Windows下的C语言编程,安装了Mingw-w64的x86_64-posix-seh版本,并按照Visual Studio Code官方的教程,将Mingw- ...

  5. JVM对象分配

    1.JVM中执行字节码new指令时: 1.1.分配内存 分配策略有两种方式:(1)指针碰撞 当JVM内存区域是连续的规整的,所有用过的内存都放在一边,空闲的内存都放在另外一边,中间放着 指针作为分界点 ...

  6. 动态数组java实现

    数组是一种顺序存储的线性表,所有元素的内存地址是连续的. 动态数组相对于一般数组的优势是可以灵活地添加或删除元素.而一般数组则受限于固定的内存空间.只能有限的添加元素 动态数组(Dynamic Arr ...

  7. SparkSQL DSL 随便写写

    @Testdef functionTest() = { Logger.getLogger("org").setLevel(Level.WARN) val spark = getSp ...

  8. SSM框架环境搭建

    SSM基础环境搭建 创建maven工程 next,finish,等待创建完成,创建完成后,src/main下只有webapp文件夹,我们需要手动创建java和resources,鼠标右击main,ne ...

  9. linux下显示dd命令的进度

    sudo dd if=/dev/zero of=/tmp/zero.img status=progresslinux下显示dd命令的进度:dd if=/dev/zero of=/tmp/zero.im ...

  10. Mybatis—curd

    Mybatis简介: MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为 ...