携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天,点击查看活动详情
0 环境
- 编辑器:idea或vscode
- 系统版本:windows10
- python版本:3.9.6
1 前言
前面介绍了匿名函数,可以像普通函数那样使用,比如将它的表达式赋值给一个变量,然后用小括号调用它。赋值的方式调用,它的特点或者说也是一种限制,不能换行啥的。那么还有哪些限制呢,还是说只是单单被限制在一行,参数没有限制和使用普通函数参数的使用是一样的呢。
2 匿名函数的限制
前提限制就是,表达式只能写一行,多了就报错。现在将我们的关注点放到匿名函数的参数,去看看它的使用是否有限制。
1 无参数时
当无参数时,会默认返回0。
def demo2():
f = lambda : 0
print(f())
if __name__ == '__main__':
demo2()
2 多参数
现在两个参数x,y,分别得到3和5,最后结果就是8。
def demo3():
f = (lambda x, y: x + y)(3, 5)
print(f)
if __name__ == '__main__':
demo3()
3 默认参数
可以使用默认参数,只需要传个值给x,x和y相加,返回相加值。
def demo5():
print((lambda x, y = 3 : x +y)(3))
if __name__ == '__main__':
demo5()
4 位置可变参数
如下可知,位置可变参数的使用,也是么有问题的,和普通函数使用一样的,*range(2)解构,args接收range(2)的解构值,最终返回args,返回值也就是(0, 1)的元组。
def demo6():
print((lambda *args: args)(*range(2)))
if __name__ == '__main__':
demo6()
5 关键字可变参数
关键字可变参数也是可以的,参数**,关键字解构得双星,别忘了,**{xx:xx},最终打印的结果,{'0': 0, '1': 1}。确实简便了很多。
def demo7():
(lambda **kwargs: print(kwargs))(**{str(x):x for x in range(2)})
if __name__ == '__main__':
demo7()
还有就是位置可变参数和关键字可变参数一起使用,还有关键字的方式,也是可以的,例子类似,就不展示了,综上来看,匿名函数支持参数变化的方式和普通函数支持的参数变化是一样使用的。
3 总结
匿名函数最大限制或者说标识,就是单行使用,只要不是单行的,就不能使用匿名函数,虽然被限制在单行,但是普通函数支持的参数变化的方式,匿名函数同样也都支持,也没有额外去做其它兼容方式,所以说除了单行的限制,冒号前是参数后是返回值,参数变化的写法确实没啥变化,普通函数怎么参数变化,匿名函数同样适用。不要说,我在冒号后面是,比如使用if..else的判断,是不是就可以换行了呢,结果显然是不行的。