匿名函数,顾名思义即没有名称的函数,和def定义的函数的最大区别在于匿名函数创建后返回函数本身(即匿名函数不需要return来返回值),表达式本身结果就是返回值,而def创建后则赋值给一个变量名,在Python中,我们利用关键词lambda创建匿名函数,以下是匿名函数lambda表达式的形式:
lambda arg1,arg2,.....argn:expression
以下为一些lambda的特点:
- lambda 是一个表达式,而不是一个语句,即我们可以在任何可以使用表达式的场景一样使用lambda。
- lambda 的主体也是一个表达式,即和def定义的函数一样,lambda也有函数主体,不过lambda的主体仅仅是一个表达式,所以其使用的功能受到较大的限制。
闲话少说,言归正传,还是栗子来的比较实惠:
匿名函数使用:
1 #python3 2 3 test1 = lambda :True 4 # 切记这个是个函数,要加括号 5 print(test1()) 6 7 test2 = lambda x: x + 1 8 print(test2(2)) 9 10 test3 = (lambda x, y: x + y)(3,4) 11 # 切记默认参数已经加了,这里不需要加括号 12 print(test3)
测试结果:
True
3
7
项目实战:
最近运行一段函数的时候,出现一个错误:
t.timeout.connect(self.updateData())
TypeError: argument 1 has unexpected type 'NoneType'
修正结果:
t.timeout.connect(lambda:self.updateData())
即可,原因是什么呢?
个人理解,这里使用了匿名函数可以的原因是这两个是不同的函数了,因为connect连接的是一个返回值,而self.updateData() 返回的是一个函数的返回值,是没有值,所以会上报这个错误,
这里还有一个解决方法,就是这样写也行了:
t.timeout.connect(self.updateData)