Python3.0中的lambda函数

在日常使用过程中,其实很容易区lambda与def,只是这里再重申一次,更为通熟易懂的能够来看待lambda的一些特性。它的写法: 一般形式是关键字lambda,之后是一个或多个参数(与一个def头部内用括号括起来的参数列表及其相似),紧跟的是一个冒号,之后是一个表达式:

lambda arg1,arg2,.....argN: expression using args

一、lambda与def差异

1、lambda就像def一样,这个表达式创建了一个之后能够调用的函数,但是它返回了一个函数而不是将这个函数赋值给一个变量名,它是匿名的,没有函数名称;对于def来说呢,会把函数对象赋值给一个变量,也就是函数名称。

2、lambda它只是一个表达式,而def则是一个语句。如何来理解这个表达式与语句的区别?

a、语句是使用关键字来组成命令,告诉解释器完成某个任务的命令。

b、语句可有输出,也可以没输出。

c、表达式没有关键字,可以是由数学操作符组成的算术表达式,也可以是括号调用的函数。

# 表达式
2*3/4
#语句
print(2*3/4)

3、除了这些差别,def和lambda都能够做同样种类的工作。

二、为什么使用lamdba

1、因为lambda起到了一种函数速写的作用,允许在使用的代码内嵌入一个函数的定义,省去函数定义的过程。

2、当需要把小段的可执行代码编写进def语句从语法上不能编写进的地方时,很有用。比如说:列表常量中。

三、如何使用

1、常规用法

    # 1、例如:一个整数列表,要求按照列表中元素的绝对值大小升序排列
    list1 = [3,5,-4,-1,0,-2,-6]
    sorted(list1, key=lambda x: abs(x))
    # 输出[0, -1, -2, 3, -4, 5, -6]

    # 2、例如:跳转表
    L = [lambda x: x ** 2,
     lambda x: x ** 3,
     lambda x: x ** 4]

    for f in L:
         print(f(2))

    print(L[0](3))

2、配合常用函数式编程工具

对于序列来讲,有三个函数式编程工具: filter()、map()和reduce()。将lambda函数作为参数传递给这些方法。

#map(function,sequence):把sequence中的值当参数逐个传给function,返回一个包含函数执行结果的list。如果function有两个参数,即map(function,sequence1,sequence2)。

#求1~20的平方
>>> list(map(lambda x:x*x,range(1,21))) 
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225, 256, 289, 324, 361, 400]

#filter(function,sequence):对sequence中的item依次执行function(item),将执行结果为True的item组成一个List/String/Tuple(取决于sequence的类型)返回。

#求1~20之间的偶数
>>> list(filter(lambda x:x%2 == 0,range(1,21))) 
[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]

#reduce(function,sequence):function接收的参数个数只能为2,先把sequence中第一个值和第二个值当参数传给function,再把function的返回值和第三个值当参数传给function,然后只返回一个结果。

#求1~100之和
>>> from functools import reduce          #Python3.x之后需要导入reduce模块
>>> reduce(lambda x,y:x+y,range(1,101))
5050

3、闭包

闭包:一个定义在函数内部的函数,闭包使得变量即使脱离了该函数的作用域范围也依然能被访问到。lambda中实现闭包则是将lambda函数作为其他函数的返回值,返回给调用者。

来看一个用lambda函数作为闭包的例子。

def add(n):
    return lambda x:x+n

add2 = add(5)
add2(15)
20

这里的lambda函数就是一个闭包,在全局作用域范围中,add2(15)可以正常执行且返回值为20。之所以返回20是因为在add局部作用域中,变量n的值在闭包的作用使得它在全局作用域也可以被访问到。

四、注意:python代码,简洁优于复杂,明确优于晦涩!

1、作用域

lambda是嵌套函数作用域查找E的最大受益者。嵌套的lambda能够获取得到在上层函数作用域中的变量的值。

F = lambda x: x + 5
print(F(3))
#8

tmplist = []

for i in range(5):
    tmplist.append(lambda: i + 3)

for t in tmplist:
    print(t())
# 7 7 7 7 7


评论(0 ) 点赞(24)


暂未登录,请登录之后发表评论。 QQ