匿名函数

#匿名函数就是不再使用def语句这样的标准形式定义一个函数。
#Python使用lambda创建匿名函数。
#lambda只是一个表达式,函数体比def简单很多。
#lambda的主体是一个表达式,而不是一个代码块,仅能在lambda表达式中封装有限的逻辑。
lambda函数拥有自己的命名空间,不能访问自有参数列表之外或全局命名空间的参数。
#lambda函数的语法只包含一个语句:
1 lambda [arg1[1,arg2,....argn]]:expression
#匿名函数应该如何应用呢?
#先看一个求两个数的和的示例。
#使用def语句:
1 #! /usr/bin/python3
2 #-*-conding:UTF-8 -*-
3 #匿名函数
4 
5 def func(x,y):
6     return x+y
#使用lambda表达式:
1 #! /usr/bin/python3
2 #-*-conding:UTF-8 -*-
3 #匿名函数
4  
5 lambda x,y:x+y
#由上面的代码可以看到,使用lambda表达编写的代码比使用def语句少。这里不太明显,再看一个代码更多的示例:
#比如求一个列表中大于3的元素。
#通过过程式编程实现,也是常规的方法。
1 >>> L1=[1,2,3,4,5]
2 >>> L2=[]
3 >>> for i in L1:
4     if i>3:
5         L2.append(i)
6 
7         
8 >>> print('列表中大于3的元素有:',L2)
9 列表中大于3的元素有: [4, 5]
#通过函数式编程实现,运用filter,给出一个判断条件:
1 #! /usr/bin/python3
2 #-*-conding:UTF-8 -*-
3 #匿名函数
4 
5 def func(x):
6     return x>3
7 f_list=filter(func,[1,2,3,4,5])
8 print('列表中大于3的元素有:',[item for item in f_list])
#执行结果如下:
1 ==================== RESTART: C:/Users/L/Desktop/匿名函数.py ====================
2 列表中大于3的元素有: [4, 5]
#如果运用匿名函数,就会更加精简,一行代码即可:
1 print('列表中大于3的元素有:',[item for item in filter(lambda x:x>3,[1,2,3,4,5])])
#执行结果如下:
1 ==================== RESTART: C:/Users/L/Desktop/匿名函数.py ====================
2 列表中大于3的元素有: [4, 5]
#从上面的操作可以看出,lambda一般应用于函数式编程,代码简洁,常和filter等函数结合使用。
#我们对上面使用lambda的示例进行解析。
#在表达式中:
#x为lambda函数的一个参数。
#:为分割符。
#x>3则是返回值,在lambda函数中不能有return,其实冒号(:)后面就是返回值。
#item for item in filter是Python3中filter函数的取值方式,因为从Python3起,filter函数返回的对象从列表改为迭代器(filter object)。filter object支持迭代操作,比如for循环:
1 for item in a_filter_object:
2        print(item)
#如果还是需要一个列表,就可以这样得到它:
1 filter_list=[item for item in a_filter_objetc]
#由这些示例可以看到,匿名函数确实有他的优点。
#那么在什么情况下使用匿名函数呢?
#一般以下情况多考虑使用匿名函数:
(1)、程序一次性使用、不需要定义函数名时,用匿名函数可以节省内存中变量定义空间。
(2)、如果想让程序更加简洁,使用匿名函数就可以做到。
#当然,匿名函数函数有3个规则需要记住:
(1)、一般有一行表达式,必须有返回值。
(2)、不能有return。
(3)、可以没有参数,也可以有一个或多个参数。
#下面示例几个匿名函数:
(1)、无参数匿名函数:
1 >>> t=lambda:True #分号前无任何参数
2 >>> t()
3 True
(2)、带参数函数:
1 >>> lambda x:x**3  #带一个参数
2 <function <lambda> at 0x035C5BB8>
3 >>> lambda x,y,z:x+y+z #带多个参数
4 <function <lambda> at 0x035C5C00>
5 >>> lambda x,y=3:x*y #允许参数存在默认值
6 <function <lambda> at 0x035C5BB8>
(3)、匿名函数调用:
1 >>> c=lambda x,y,z:x*y*z
2 >>> c(2,3,4)
3 24
4 >>> c=lambda x,y=2:x+y #使用了默认值
5 >>> c(10) #如果不输入,就使用默认值2
6 12

 

posted @ 2017-11-08 09:54  爱你无目的  阅读(239)  评论(0编辑  收藏  举报