开门见山,匿名函数(不配拥有名字的函数么??)旨在用一行表达式将函数的作用表达清楚,匿名函数满足以下条件:
- 不管怎么说lambda也是函数,也是python中的一等公民
- 函数功能简单(表达简单),看内容就能知道函数的作用
- 尽管结合多元运算符也可以实现复杂的功能(个人不建议)
题外话:lambda的使用在python中一直存在争议,匿名到底需要应用在什么样复杂程度的函数上?
匿名函数也是函数
lambda的定义格式:lambda 输入: 返回值(结果)
注意返回值无需使用return,返回是缺省的
一个简单的功能实现多功能的指数函数:
power = lambda a, b: a**b # 计算a的b次方
power(2, 3)
8
使用函数传参(可以优雅的表达)
假设有一个列表,我们需要过滤其中小于0的值。filter()
函数是很好的选择:
# 创建样板数据
l = [-1, 2, 4, -3, 8, 9]
print(filter.__doc__)
filter(function or None, iterable) --> filter object
Return an iterator yielding those items of iterable for which function(item)
is true. If function is None, return the items that are true.
jupyter环境下可以使用shift+tab, 或filter?、filter??查看函数文档
接收一个function和一个可迭代对象完成满足function判定的删选,我们可以使用lambda来实现:
# 删选出大于0的内容
filtered = filter(lambda s: s>0, l)
# 将迭代器转换列表输出
list(filtered)
[2, 4, 8, 9]
像这样的情况使用lambda是很合适的,能够很清晰地表达自己的想法!
数据科学中常用
以apply()
函数为例,假设一个数据帧DataFrame有ABC三列,需要由AB列值生成D列
创建DataFrame:
import numpy as np
import pandas as pd
np.random.seed(0)
df = pd.DataFrame(np.random.randint(-10, 10, size=(10, 3)), columns=list('ABC'))
df
A | B | C | |
---|---|---|---|
0 | 2 | 5 | -10 |
1 | -7 | -7 | -3 |
2 | -1 | 9 | 8 |
3 | -6 | -4 | 2 |
4 | -9 | -4 | -3 |
5 | 4 | 7 | -5 |
6 | 3 | -2 | -1 |
7 | 9 | 6 | 9 |
8 | -5 | 5 | 5 |
9 | -10 | 8 | -7 |
如果AB都为负,那么D为1, 否则为0:
df['D'] = df.loc[:, 'A':'B'].apply(lambda s: 1 if s[0]<0 and s[1]<0 else 0, axis=1)
df
A | B | C | D | |
---|---|---|---|---|
0 | 2 | 5 | -10 | 0 |
1 | -7 | -7 | -3 | 1 |
2 | -1 | 9 | 8 | 0 |
3 | -6 | -4 | 2 | 1 |
4 | -9 | -4 | -3 | 1 |
5 | 4 | 7 | -5 | 0 |
6 | 3 | -2 | -1 | 0 |
7 | 9 | 6 | 9 | 0 |
8 | -5 | 5 | 5 | 0 |
9 | -10 | 8 | -7 | 0 |
lambda同样支持三元运算符,这样的表达依据个人的基础使用。
支持lambda的表达都支持自定义函数(lambda也是函数!):
def calD(series):
if series[0] < 0 and series[1] < 0:
return 1
else:
return 0
np.random.seed(0)
df = pd.DataFrame(np.random.randint(-10, 10, size=(10, 3)), columns=list('ABC'))
df['D'] = df.loc[:, 'A':'B'].apply(calD, axis=1)
df
A | B | C | D | |
---|---|---|---|---|
0 | 2 | 5 | -10 | 0 |
1 | -7 | -7 | -3 | 1 |
2 | -1 | 9 | 8 | 0 |
3 | -6 | -4 | 2 | 1 |
4 | -9 | -4 | -3 | 1 |
5 | 4 | 7 | -5 | 0 |
6 | 3 | -2 | -1 | 0 |
7 | 9 | 6 | 9 | 0 |
8 | -5 | 5 | 5 | 0 |
9 | -10 | 8 | -7 | 0 |