又有好多天没有碰Python的东西了,下午抽出点时间就补一篇介绍匿名函数
匿名函数在很多语言里都有,它可以使代码更加简洁、紧凑,模块化程度更高。
在jdk8里发现了lambda表达式的影子
以前我们要循环一个集合需要这样
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
for (int number : numbers) { System.out.println(number); }
现在可以这样
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
numbers.forEach((Integer value) -> System.out.println(value));
那么这么做的优势是什么?
1.不一定需要顺序处理List中的元素,顺序可以不确定
2.可以并行处理,充分利用多核CPU的优势
3.有利于JIT编译器对代码进行优化
我们回到Python,那么Python是如何操作的呢?
一个自增的方法
def add(x):
return x + x
print(add(2))
结果:4
那么用户匿名函数如何实现呢?
v = lambda x: x + x
print(v(2))
结果:4
语法:
lambda [arg1[, arg2, ... argN]]: expression
在上面的例子里
x 为lambda函数的一个参数
: 分割符
在lambda函数中不能有return,其实:后面就是返回值所以也就返回了传入的2+2=4
这里还是把表达式指向了一个对象,不然打印出来就是
<function <lambda> at 0x101c6ef28>
为什么要用匿名函数?
程序一次行使用,所以不需要定义函数名,节省内存中变量定义空间
如果想让程序更加简洁时。
那我们再来说说其他的几种实现
有默认值的匿名函数
list = lambda x=3: x + 3
print('3为默认值', list(), list(5))
list1 = lambda x: x + 3
print('无默认值', list1(1))
结果:
3为默认值 6 8
无默认值 4
如果传参就把X等于传入的参数,如果不传参那就为默认值
# 像变量一样的匿名函数
v1 = lambda: 123
print('无参数匿名函数', v1())
结果:
无参数匿名函数 123
# 传入多个参数的匿名函数,但是这种模式不支持多个参数有默认值
list2 = lambda z, x, c=3: z + x + c
print('传入多个参数的匿名函数', list2(1, 2, 5))
结果:
传入多个参数的匿名函数 8
源码地址:https://github.com/ddwhan0123/PythonExample/blob/master/示例/l9Demo.py