lambda表達式
也就是匿名函數。
用法:lambda 參數列表 : 返回值
例:
+1函數
f=lambda x:x+1
max函數(條件語句的寫法如下)
f_max=lambda x,y:x if x>y else y
上述定義的函數與用def定義的函數沒有區別,而且左邊的f=在某些情況下並不是必要的。
filter,map,reduce
filter函數接受兩個參數,第壹個是過濾函數,第二個是可遍歷的對象,用於選擇出所有滿足過濾條件的元素,不同版本的filter的返回值稍有區別,我用的是python3.5,filter返回的是經過過濾的可遍歷對象。
例:
去除小寫字母
s=filter(lambda x:not str(x).islower(),"asdasfAsfBsdfC")
for ch in s:
print(ch)
map函數接受的參數類型與filter類似,它用於把函數作用於可遍歷對象的每壹個元素。類似於數學中映射的概念。
例:
求y=2x+1(偷偷用了壹下range函數生成定義域)
s=map(lambda x:2*x+1,range(6))
for x in s:
print(x)
reduce函數對每個元素作累計操作,它接受的第壹個參數必須是有兩個參數的函數。
例:
求和
from functools import reduce
s=reduce(lambda x,y:x+y,range(1,6))
print(s)
求乘積(第三個可選參數表示累計變量的初值)
from functools import reduce
s=reduce(lambda x,y:x*y,range(1,6),1)
print(s)
柯裏化(curry)函數
如果壹個函數需要2個參數,而妳只傳入壹個參數,那麽妳就可以得到壹個柯裏化的函數,這是函數式編程語言的重要特性之壹,遺憾的是,python並不能在語法層面支持柯裏化調用,但它在庫中提供了接口。
例:
*3函數
f_mul=lambda x,y:x*y
from functools import partial
mul3=partial(f_mul,3)
print(mul3(1))
print(mul3(6))
打包與解包
有點類似於函數式中的模式匹配,略牽強。
t=(1,2,3)
x,y,z=t
列表生成式
這個也有點牽強,不知道嚴格意義上講屬不屬於函數式風格。
例:生成奇數序列
l=[2*x+1 for x in range(10)]
for i in l:
print(i)
最後來壹個彩蛋(以前某答主提到的用調分函數來美顏的算法,忘了出處了,侵刪)
from PIL import Image
from math import sqrt
im = Image.open("a.jpg")
ret= im.convert(mode="RGB")
ret = ret.point(lambda x:sqrt(x)*sqrt(255))
ret.save("b.jpg")