一、提要
在学习python的过程中,lambda的语法时常会使人感到困惑,lambda是什么,为什么要使用lambda,是不是必须使用lambda?下面就上面的问题进行一下解答。
二、lambda是什么?
Lambda 表达式(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。Lambda表达式可以表示闭包
2.1 看几个例子
g = lambda x:x+1
看一下执行的结果:
g(1)
>>>2
g(2)
>>>3
你也可以这样使用:
lambda x:x+1(1)
>>>2
可以这样认为,lambda作为一个表达式,定义了一个匿名函数,上例的代码x为入口参数,x+1为函数体,用函数来表示为:
1 def g(x): 2 return x+1
非常容易理解,在这里lambda简化了函数定义的书写形式。是代码更为简洁,但是使用函数的定义方式更为直观,易理解。
2.2 lambda函数的四个形式
labmda函数由简单到复杂,存在四种形象:
# 1)无参数
lambda_a = lambda: 100
print(lambda_a())
# 2)一个参数
lambda_b = lambda num: num * 10
print(lambda_b(5))
# 3)几个参数
lambda_c = lambda a, b, c, d: a + b + c + d
print(lambda_c(1, 2, 3, 4))
# 4)带表达式分支
lambda_d = lambda x: x if x % 2 == 0 else x + 1
print(lambda_d(6))
print(lambda_d(7))
Python中,也有几个定义好的全局函数与lambda配合,filter, map, reduce配合使用。
三、与map函数复合
3.1 map函数的概念
map函数,是对一个序列数,逐个采用某个函数处理的结果,其结果是一个可迭代对象:
语法形式:
map(function, iterable, ...)
范例1:
def square(x) : # 计算平方数
return x ** 2
lst = [1,2,3,4,6]
ss = list( map(square, lst ) ) # 计算列表各个元素的平方
print(ss)
结果:[1, 4, 9, 16, 36]
范例2:
def square(x,y) : # 计算平方数
return x ** 2 + y**2
lst1 = [1,2,3,4,6]
lst2 = [5,4,3,2,1]
ss = list( map(square, lst1, lst2) ) # 计算列表各个元素的平方
print(ss)
3.2 lambda和map复合
范例1:
lst = [1,2,3,4,6]
ss = list( map(lambda x: x**2 , lst ) ) # 计算列表各个元素的平方
print(ss)
范例2
square = lambda x,y : x ** 2 + y**2
lst1 = [1,2,3,4,6]
lst2 = [5,4,3,2,1]
ss = list( map(square, lst1, lst2) ) # 计算列表各个元素的平方
print(ss)
四、与filter函数复合
4.1 filter函数
filter() 函数从指定函数,和指定序列中,返回 True 的元素:
语法: filter(function,iterable )
filter()
有两个输入形参:
案例1:
letters = ['a', 'b', 'd', 'e', 'i', 'j', 'o']
# a function that returns True if letter is vowel
def filter_vowels(letter):
vowels = ['a', 'e', 'i', 'o', 'u']
return True if letter in vowels else False
filtered_vowels = filter(filter_vowels, letters)
# converting to tuple
vowels = tuple(filtered_vowels)
print(vowels)
案例2:
# random list
random_list = [1, 'a', 0, False, True, '0']
filtered_iterator = filter(None, random_list)
#converting to list
filtered_list = list(filtered_iterator)
print(filtered_list)
4.2 与lambda联合使用
下例,求序列的偶数:
numbers = [1, 2, 3, 4, 5, 6, 7]
# the lambda function returns True for even numbers
even_numbers_iterator = filter(lambda x: (x%2 == 0), numbers)
# converting to list
even_numbers = list(even_numbers_iterator)
print(even_numbers)
五、和reduce联合使用
5.1 reduce的基本概念
reduce() 函数会对参数序列中元素进行累积。
函数将一个数据集合(链表,元组等)中的所有数据进行下列操作:用传给 reduce 中的函数 function(有两个参数)先对集合中的第 1、2 个元素进行操作,得到的结果再与第三个数据用 function 函数运算,最后得到一个结果。
语法:reduce(function,iterable )
范例1:求阶乘
from functools import reduce
def multi(x,y):
return x*y
foo = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print ( reduce(multi, foo) )
5.2 reduce 和lambda配合
范例1:求阶乘
from functools import reduce
foo = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print ( reduce(lambda x, y: x * y, foo) )
范例2:复杂用法
# python code to demonstrate working of reduce()
# using operator functions
# importing functools for reduce()
import functools
# importing operator for operator functions
import operator
# initializing list
lis = [1, 3, 5, 6, 2, ]
# using reduce to compute sum of list
# using operator functions
print("The sum of the list elements is : ", end="")
print(functools.reduce(operator.add, lis))
# using reduce to compute product
# using operator functions
print("The product of list elements is : ", end="")
print(functools.reduce(operator.mul, lis))
# using reduce to concatenate string
print("The concatenated product is : ", end="")
print(functools.reduce(operator.add, ["geeks", "for", "geeks"]))
六、小结
上面例子中的map的作用,非常简单清晰。但是,Python是否非要使用lambda才能做到这样的简洁程度呢?在对象遍历处理方面,其实Python的for..in..if语法已经很强大,并且在易读上胜过了lambda。
6.1 等价的其它语句
比如上面map的例子,可以写成:
print( [x * 2 + 10 for x in foo] )
非常的简洁,易懂。
filter的例子可以写成:
print( [x for x in foo if x % 3 == 0] )
同样也是比lambda的方式更容易理解。
6.2 结论和建议
- lambda 定义了一个匿名函数
- lambda 并不会带来程序运行效率的提高,只会使代码更简洁。
- 如果可以使用for...in...if来完成的,坚决不用lambda。
- 如果使用lambda,lambda内不要包含循环,如果有,我宁愿定义函数来完成,使代码获得可重用性和更好的可读性。