python拉姆达 python lambada函数_python

一、提要

  在学习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() 有两个输入形参:

  • function - a function
  • iterable - an iterable like setsliststuples etc.

案例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内不要包含循环,如果有,我宁愿定义函数来完成,使代码获得可重用性和更好的可读性。