python3 第二十四章 - 函数式编程之Anonymous function(匿名函数)

匿名函数指一类无须定义标识符的函数或子程序。Python用lambda语法定义匿名函数,只需用表达式而无需申明。
lambda语法的定义如下:

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

有些时候,当我们在传入函数时,不需要显式地定义函数,直接传入匿名函数更方便。匿名函数有个限制,就是只能有一个表达式,无需写return,返回值就是该表达式的结果。用匿名函数有个好处,因为函数没有名字,不必担心函数名冲突。此外,匿名函数也是一个函数对象,也可以把匿名函数赋值给一个变量,再利用变量来调用该函数

实例:

# 可写函数说明
sum = lambda arg1, arg2: arg1 + arg2

# 调用sum函数
print("相加后的值为 : ", sum(10, 20))
print("相加后的值为 : ", sum(20, 20))

以上代码,输出:

相加后的值为 :  30
相加后的值为 :  40

 

在定义时直接被调用,比如:

print((lambda x, y: x-y)(3, 4))

 以上代码,输出:

-1

 

 但通常都是在定义lambda函数的同时将其应用作为参数传递给另一个函数,该函数在其处理过程中对lambda定义的函数进行调用,例如:

L = [1, 2, 3, 4, 5, 6, 7, 8]

# 过滤掉所有的偶数
res = filter(lambda x: x % 2 == 1, L)

print(list(res))

 以上代码,输出:

[1, 3, 5, 7]

 

 

上面几个实例都是比较简单的,我们再来看几个复杂的。假如,我们要找出两个数中小的那一个,我们可以用lambda这么写:

fn = lambda x, y: x if x < y else y

print(fn(1, 2))

 以上代码,输出:

1

 

在上面的实例中,函数体里的那种写法,实际上是python中的三元表达式(三目运算符)。在Python中,语法如下:

为真时的结果 if 判定条件 else 为假时的结果  

 例如:

1 if 5>3 else 0

是先输出结果,再判定条件,输出1,如果5大于3,否则输出0

 

再来几个更复杂的,后面这几个如果你是初学者,可以略过!

柯里化(什么是柯里化?https://baike.baidu.com/item/%E6%9F%AF%E9%87%8C%E5%8C%96/10350525?fr=aladdin):

res = (lambda x: (lambda y: (lambda z: x + y + z)(1))(2))(3)

print(res)

 以上代码,输出:

6

 

递归:

func = lambda n: 1 if n == 0 else n * func(n-1)
print(func(5))

 以上代码,输出:

120

f = lambda func, n: 1 if n == 0 else n * func(func, n - 1)
print(f(f, 4))

 以上代码,输出:

24

 

 匿名函数有以下几个特点:

  • lambda 只是一个表达式,函数体比 def 简单很多。
  • lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
  • lambda 函数拥有自己的命名空间,像嵌套的函数定义,lambda 函数可以从包含它的作用域中引用变量。
posted @ 2018-02-05 22:18  MrBug  阅读(688)  评论(0编辑  收藏  举报

人生就是一场战斗,唯有披荆斩棘,勇往直前!