Python的匿名函数使用进阶

1.背景

python中函数应用一方面是将重复使用的代码块抽象为一个函数从而降低代码的冗余度,即通过入参,返回值完成函数的调用并完成一定功能,另一方面是将复杂的代码块使用函数来封装,从而提高程序的可读性。

评定代码质量的一个指标就是clean code,随着python语言的发展,发现函数通过使用def定义来实现,有些时候显得费事,就出现了匿名函数即lambda的使用,普通函数是一种过程式编程,lambda则是一种函数式编程,那么什么是函数式编程,下面让我婉婉道来:

实现两个数值之和的函数的方法:

 1 #!/usr/bin/python  
 2 # encoding: utf-8  
 3       
 4 
 5 def sum(a,b):
 6     c=a+b
 7     return c
 8 
 9 if __name__=="__main__":
10     print sum(2,4)


a=lambda x,y: x+y
    print a(1,2) #使用匿名函数的实现方法

你觉得那种方法看起更专业?

但是展现匿名函数"神奇"的地方是结合filter,map和reduce的使用

需求案例:

当你需要从一个列表里面检索出满足一定条件的元素

1 #!/usr/bin/python  
2 # encoding: utf-8  
3       
4 
5 if __name__=="__main__":
6     data=[1,2,4,67,85,34,45,100,456,34]
7     print filter(lambda x:x%3==0,data)

上面的例子就是找出这个列表中能被3整除的元素

结果:

[45, 456]

x 为lambda函数的一个入参

:为分隔符

x%3==0 为lambda函数的返回值,同时作为filter函数的入参,如果为真就将该元素加入返回列表中

data就是传入的源数据列表

匿名函数的调用
赋值给一个变量,然后如调用函数一样调用就是了
1 #!/usr/bin/python  
2 # encoding: utf-8  
3       
4 
5 if __name__=="__main__":
6     c = lambda x,y=5: x+y
7     print c(2)
8     print c(2,4)

可使用默认值,如果有传入的参数值当然是要传入的值了

输出结果:

7
6

1 #!/usr/bin/python  
2 # encoding: utf-8  
3       
4 
5 if __name__=="__main__":
6     c = lambda *z:z
7     print c(2)
8     print c("ni","hao")

输出结果:

(2,)
('ni', 'hao')  # 以*z的形式传入参数,返回结果是元组

#!/usr/bin/python  
# encoding: utf-8  
      

if __name__=="__main__":
    data=[1,2,3,4,5,6,7,8,9,10]
    print reduce(lambda x,y:x+y,data)

上面的例子是lambda和reduce联合使用实现累加的功能

posted @ 2017-10-22 18:20  554303896  阅读(1206)  评论(0编辑  收藏  举报