1. 定義lambda表達(dá)式
- lambda表達(dá)式又稱匿名函數(shù),常用來表示內(nèi)部僅包含1行表達(dá)式的函數(shù)嗡善,語法格式如下:
func = lambda [arg1[, arg2,... argN]]: expression
func是一個變量蜗字,引用lambda定義的函數(shù)對象
lambda是關(guān)鍵字
[arg1[, arg2,... argN]]是可選參數(shù)晚吞,等同于定義函數(shù)時要指定的參數(shù)列表
expression是一行表達(dá)式,其運(yùn)算結(jié)果就是函數(shù)的返回值
- 轉(zhuǎn)換成def函數(shù)語法如下:
def func([arg1[, arg2,... argN]]):
return expression
- 舉例:設(shè)計(jì)求兩個數(shù)之和
# 普通函數(shù)的方式
def add(x, y):
return x+y
print(add(3, 4))
# lambda表達(dá)式
add1 = lambda x, y: x+y
print(add1(3, 4))
2. lambda表達(dá)式與def函數(shù)區(qū)別
- lambda可以定義一個匿名函數(shù)埋酬,而def定義的函數(shù)必須有一個名字
- lambda是一個表達(dá)式,而不是一個語句烧栋。因此能夠出現(xiàn)在python語法不允許def出現(xiàn)的地方写妥。例如,在一個列表常量中审姓,或者函數(shù)調(diào)用的參數(shù)中
- lambda的主體是一個單個的表達(dá)式珍特,而不是一個代碼塊。lambda包含的代碼相當(dāng)于def中return子句后的代碼魔吐,只能是簡單的表達(dá)式扎筒,所以說lambda的能力小于def,在lambda中只能使用簡單的語法酬姆,不能使用if else while return等語句
3. 相比def函數(shù)嗜桌,lambda表達(dá)式的優(yōu)勢
- 對于單行函數(shù),使用lambda表達(dá)式可以省去定義函數(shù)的過程辞色,讓代碼更加簡潔
- 對于不需要多次復(fù)用的函數(shù)骨宠,使用lambda表達(dá)式可以在用完后立即釋放,提高程序執(zhí)行的性能
4. 應(yīng)用
filter()
篩選100以內(nèi)的3的倍數(shù)相满,并生成一個列表
# lambda表達(dá)式實(shí)現(xiàn)
l = list(filter(lambda x: True if x % 3 == 0 else False, range(100)))
print(l)
# def函數(shù)實(shí)現(xiàn)
def f(x):
if x % 3 == 0:
return True
else:
return False
l = list(filter(f, range(100)))
print(l)
"""
[0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96, 99]
"""
filter()簡單的理解為過濾器层亿,它需要兩個參數(shù),function和一個序列(字符串立美、列表匿又、元組都是序列),過濾器會依次將序列的值傳入function中悯辙,如果返回True的話琳省,將其重新生成一個列表返回。
map()
# def函數(shù)實(shí)現(xiàn)
li = [11, 22, 33]
sl = [1, 2, 3]
def f(a, b):
return a+b
l1 = map(f, li, sl)
print(list(l1))
# lambda表達(dá)式實(shí)現(xiàn)
l2 = map(lambda a, b: a+b, li, sl)
print(list(l2))
"""
[12, 24, 36]
[12, 24, 36]
"""
map()表示映射躲撰,它需要兩個參數(shù)针贬,function和一個序列(字符串、列表拢蛋、元組都是序列)桦他,也是將序列放入函數(shù)進(jìn)行運(yùn)算,不論運(yùn)算結(jié)果是什么,map()都將逐一反饋
reduce()
對序列內(nèi)元素進(jìn)行累加((((1+2)+3)+4)+5)
from functools import reduce
# def函數(shù)實(shí)現(xiàn)
li = [1, 2, 3, 4, 5]
def f(a, b):
return a+b
l1 = reduce(f, li)
print(l1)
# lambda表達(dá)式實(shí)現(xiàn)
l2 = reduce(lambda a, b: a+b, li)
print(l2)
"""
15
15
"""
對序列內(nèi)元素進(jìn)行階乘((((1*2)*3)*4)*5)
# def函數(shù)實(shí)現(xiàn)
def f(a, b):
return a*b
l1 = reduce(f, range(1, 6))
print(l1)
# lambda表達(dá)式實(shí)現(xiàn)
l2 = reduce(lambda a, b: a*b, range(1, 6))
print(l2)
"""
120
120
"""
reduce()表示累計(jì)快压,它需要兩個參數(shù)圆仔,function和一個序列(字符串、列表蔫劣、元組都是序列)坪郭,也是將序列放入函數(shù)進(jìn)行累計(jì)運(yùn)算
sort()
根據(jù)每個元組的第一個元素進(jìn)行排序
a = [(4, 1), (1, 2), (9, 10), (13, -3)]
a.sort(key=lambda x: x[0])
print(a)
"""
[(1, 2), (4, 1), (9, 10), (13, -3)]
"""