在学习python的过程中,lambda的语法时常会使人感到困惑,lambda是什么,为什么要使用lambda,是不是必须使用lambda?下面就上面的问题进行一下解答。
Lambda 表达式(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。Lambda表达式可以表示闭包
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简化了函数定义的书写形式。是代码更为简洁,但是使用函数的定义方式更为直观,易理解。
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函数,是对一个序列数,逐个采用某个函数处理的结果,其结果是一个可迭代对象:
语法形式:
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)
范例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() 函数从指定函数,和指定序列中,返回 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)
下例,求序列的偶数:
- 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() 函数会对参数序列中元素进行累积。
函数将一个数据集合(链表,元组等)中的所有数据进行下列操作:用传给 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) )
范例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。
比如上面map的例子,可以写成:
print( [x * 2 + 10 for x in foo] )
非常的简洁,易懂。
filter的例子可以写成:
print( [x for x in foo if x % 3 == 0] )
同样也是比lambda的方式更容易理解。