lambda 函式是「只有一行」的函式,可以用来处理一些小型函式,就可以不用为了一小段程式码,额外新增一个有名称的函式,这篇教学将会介绍Python 的匿名函式。
匿名函式的特性
lambda 匿名函式具有下列几种特性:
- 匿名函式不需要定义名称,一般函式需定义名称。
- 匿名函式只能有一行运算式,一般函式可以有多行运算式。
- 匿名函式执行完成后自动回传结果,一般函式加上return 关键字才能回传结果。
使用匿名函式 lambda
lambda 函式的使用方法为「lambda 名稱: 內容
」,下方的程式里,lambda 函式执行的结果等同于hello 函式。
def hello(title):
print(title)
hello('oxxo') # oxxo
(lambda title: print(title))('oxxo') # oxxo
使用多个参数
lambda 函式可以支援参数,使用时「不需要用小括号」包住参数,如果有多个参数时,使用「逗号」分隔每个参数,此外,如果函式里会有回传值,在lambda函式里不需要撰写return 语法,计算完毕就会将值回传。
下方的程式里,lambda 函式执行的结果等同于hello 函式,会计算出x+y 的数值。
def hello(x, y):
return x+y
a = hello(1,2)
b = (lambda x, y: x+y)(1,2)
print(a) # 3
print(b) # 3
lambda 函式可以给予一个变数作为名称( function name ),使用时就像是呼叫函式的用法,但仍然要注意lambda 函式只能撰写「一行程式」,所以只适用于比较小型的程式。
下方的程式里,lambda 函式b 执行的结果等同于a 函式,会计算出x+y 的数值。
def a(x, y):
return x+y
b = lambda x, y: x+y
print(a(1,2)) # 3
print(b(1,2)) # 3
搭配for 回圈
下方的程式将lambda 函式y 与for 回圈搭配( 参考for 回圈),效果等同于x 函式。
def x(n):
a = list(range(n))
return a
y = lambda n: [i for i in range(n)] # 计算后回传串列结果
print(x(5)) # [0, 1, 2, 3, 4]
print(y(5)) # [0, 1, 2, 3, 4]
搭配if 判断式
下方的程式将lambda 函式y 与if 判断式搭配( 参考逻辑判断( if、elif、else ),效果等同于x 函式。
def y(n):
if n<10:
return True
else:
return False
x = lambda n: True if n<10 else False # 判断是否小于 10,回传 True 或 False
print(x(5)) # True
print(y(5)) # True
搭配 map 方法
下方的程式将lambda 函式map 方法搭配,产生一个新的b 串列,b 串列的项目是a 串列项目的平方。
a = [1,2,3,4,5,6,7,8,9]
b = map(lambda x: x*x, a)
print(list(b)) # [1, 4, 9, 16, 25, 36, 49, 64, 81]
搭配 filter 方法
下方的程式将lambda 函式filter 方法搭配,filter 方法会将True 的项目留下,所以新串列的项目都会是大于5 的数字。
a = [1,2,3,4,5,6,7,8,9]
b = filter(lambda x: x>5, a)
print(list(b)) # [6, 7, 8, 9]
搭配 sorted 方法
下方的程式将lambda 函式sorted 方法搭配,当sorted 方法设定key 参数时,会根据key 进行排序,所以会根据阵列中第二个项目的大小进行排序。
a = [[1,2],[4,3],[5,1],[9,2],[3,7]]
b = sorted(a, key = lambda x: x[1])
print(list(b)) # [[5, 1], [1, 2], [9, 2], [4, 3], [3, 7]]