参考资料:https://mp.weixin.qq.com/s/f0AIMIRztOiiIKIeeLitig
01引言
不管大家是Python新手还是老手 ,一定都听说过Lambda 函数。它的语法简单而且用起来相当方便。
本文主要是介绍Python lambda 函数的,为了阅读方便,分为以下 3 个部分来进行讲解——语法、用法和常见错误。
02语法**
在Python中函数一般分为以下两种类型:
- 普通函数 — 使用def关键字定义,并且有用户自定义的函数名
- 匿名函数 — 使用lambda关键字定义,没有函数名
让我们来看个例子,不妨我们来定义一个普通函数来求解圆的周长,代码如下:
import mathdef circle_circum(radius): return 2 math.pi radius
上述中,circle_circum为函数名,是由用户定义的,radius为输入参数。
接着我们来将上述函数修改成Lambda函数,代码如下:
import mathlambda radius: 2 math.pi radius
上述代码中,我们使用lambda关键字来替换def关键字,需要注意的是lambda函数为匿名函数,不需要指定函数名,并且没有显示的return关键字。
一般来说,Lambda函数的通用语法如下:
lambda
解释如下:
- 一个lambda函数可以有0个或多个参数,参数间使用逗号隔开
- 一个lambda函数只能有一个表达式,该表达式根据参数来定义函数相关功能。
- 表达式和参数之间使用分号隔开
-
03常用场景
一般来说,在以下情形下lambda函数为首选:
当只需要使用某函数一次调用时。
- 在函数的定义中只有一个简单的表达式的时候。
在以下情形,并不推荐你使用lambda函数:
- 当你需要重复使用某个函数多次时
- 在函数实现中有多个复杂的表达式的时候
Lambda函数经常和filter(),map(),reduce()以及sorted()函数搭配使用,以下举例来进行讲解。
04Lambda with filter()**
filter()函数为Python的内置函数,它主要用于从迭代数据类型(list tuple等)中根据条件来挑选元素,语法如下:
filter(function, iterable)
观察上述函数,我们可以把lambda函数作为filter()函数的参数。接下来我们来举个栗子:
iterable = [1, 3, 5, 6, 9, 11, 15, 16, 21]list(filter(lambda x: x % 3 == 0, iterable))
上述代码,实现了从迭代列表中挑选出可以被3整除的元素,输出如下:
[3,6,9,15,21]
05Lambda with map()
map()函数也是Python的内置函数之一,它可以将迭代类型的每一个元素进行相应的转换,语法如下:
map(function, iterable)
同理,我们也可以把lambda函数作为map()函数的参数。接下来我们来举个栗子:
iterable = [1, 3, 5, 6, 9, 11, 15, 16, 21]list(map(lambda x: x ** 2, iterable))
上述代码,实现了对迭代列表中的每个元素执行求平方操作,输出如下:
[1,9,25,36,81,121,225,256,441]
06Lambda with reduce()
reduce()函数不是Python的内置函数,它包含在functools里,需要专门导入。该函数可以对参数序列中的元素进行累计操作。语法如下:
reduce(function, iterable)
我们也可以把reduce()函数作为map()函数的参数。接下来我们来举个栗子:
# First import the reduce functionfrom functools import reduceiterable = [1, 3, 5, 6, 9, 11, 15, 16, 21]reduce(lambda x, y: x + y, iterable)
上述代码,实现了对迭代列表中的所有元素执行累加求和操作,输出如下:
87
07Lambda with sorted()
sorted()函数是Python的内置函数之一,它可以用来将迭代类型中的元素进行升序或者降序排列,语法如下:
sorted(iterable, key, reverse)
上述声明中,sorted函数的默认值为reverse=False即默认为升序排列,如果我们将其设置为True,那么排序将变为降序排列。我们来看个栗子:
iterable = [1, 5, 3, 9, 6, 11, 16, 21, 15]sorted(iterable) # Ascending order
输出如下:
[1,3,5,6,9,11,15,16,21]
同时,对于参数key我们可以传递lamda函数来实现自定义的排序,样例如下:
iterable = [1, 5, 3, 9, 6, 11, 16, 21, 15]sorted(iterable, key=lambda x: x % 5)
输出如下:
[5,15,1,6,11,16,21,3,9]
上述代码将列表中的元素按照对5求余后进行排序,排序的标准主要是通过lambda函数传递给参数key。
08常见错误
当你没有正常使用lambda函数时,会有错误出现。这里列举常见的几种错误类型。
语法错误
当我们忘记每个参数之间的逗号,或者忘记分隔表达式和参数名称之间的冒号,或者没有在一行中编写 Lambda 函数时,可能会发生这种情况。
举例如下:
iterable = [1, 3, 5, 6, 9, 11, 15, 16, 21]reduce(lambda x y: x + y, iterable) # 缺失逗号_reduce(lambda x, y x + y, iterable) # 缺失分号reduce(lambda x y: x + y, iterable) # 多行_
上述代码中,运行的错误提示如下:
类型错误
当我们在表达式中包含的参数名称多于参数部分中给出的参数名称时,就会发生这种情况。举例如下:
iterable = [1, 3, 5, 6, 9, 11, 15, 16, 21]reduce(lambda x: x + y, iterable)
此时,上述代码运行的错误提示如下:
09总结
本文重点介绍了lambda表达式的语法,用法和常见错误,并详细地给出了代码示例和相应的讲解。