Python之函數式編程
一、高階函數
1.map:
用法:map(函數對象,序列)
作用:將序列內每一個對象作用與函數的參數並生成一個新的序列返回
例子:將列表中的名字首字母大寫 其余字母小寫放入列表中
def OrderName(name): g = lambda Newname:Newname[0].upper() + Newname[1:].lower() return g(name) lst = [‘adam‘, ‘LISA‘, ‘barT‘] print map(OrderName, lst)
2.reduce:
用法:reduce(函數對象,序列)
作用:reduce把一個函數作用在一個序列[x1, x2, x3...]上,這個函數必須接收兩個參數,reduce把結果繼續和序列的下一個元素做累積計算,其效果就是:
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
例子:Python提供的sum()
函數可以接受一個list並求和,編寫一個prod()
函數,可以接受一個list並利用reduce()
求積。
def prod(lst): return reduce(lambda x, y: x*y, lst) lst = [1,2,3,4,5,6] print prod(lst)
3.filter
用法:filter(函數對象,序列)
作用:filter()
把傳入的函數依次作用於每個元素,然後根據返回值是True(保留)
還是False
例子:使用filter()篩除 1~100 的素數
def mDel(num): if num == 1: return True for i in range(2, num): if num % i == 0: return True return False print filter(mDel, range(1, 101))
## 考慮 1 不是 素數 也不是合數 所以應該保留 1 ##
4.sorted
排序也是在程序中經常用到的算法。無論使用冒泡排序還是快速排序,排序的核心是比較兩個元素的大小。如果是數字,我們可以直接比較,但如果是字符串或者兩個dict呢?直接比較數學上的大小是沒有意義的,因此,比較的過程必須通過函數抽象出來。通常規定,對於兩個元素x
y
,如果認為x < y
,則返回-1
,如果認為x == y
,則返回0
,如果認為x > y
,則返回1
,這樣,排序算法就不用關心具體的比較過程,而是根據比較結果直接排序。
也可以在 使用 sorted(序列,自定義比較函數) 來擬定自己的規則進行比較並得出比較結果。
例子:不分大小寫比較一組姓名(由於直接比較會導致ASCII碼在後的小寫字母判斷比大寫字母值小)
def myCmp(s1, s2): u1 = s1.upper() u2 = s2.upper() if u1 > u2: return 1 elif u1 == u2: return 0 elif u1 < u2: return -1 lst = [‘bob‘, ‘about‘, ‘Zoo‘, ‘Credit‘] print sorted(lst, myCmp)
二、返回函數
高階函數除了可以接受函數作為參數外,還可以把函數作為結果值返回。
def lazy_sum(*args): def sum(): ax = 0 for n in args: ax = ax + n return ax return sum
調用lazy_sum不會立即返回計算的值,而是返回sum函數對象
>>> f = lazy_sum(1, 3, 5, 7, 9) >>> f <function sum at 0x10452f668>
再次調用 f 才會真正返回求和的值
>>> f()
25
在這個例子中,我們在函數lazy_sum
中又定義了函數sum
,並且,內部函數sum
可以引用外部函數lazy_sum
的參數和局部變量,當lazy_sum
返回函數sum
時,相關參數和變量都保存在返回的函數中,這種稱為“閉包(Closure)”的程序結構擁有極大的威力。
返回閉包時牢記的一點就是:返回函數不要引用任何循環變量,或者後續會發生變化的變量。
三、匿名函數
匿名函數lambda x: x * x
實際上就是:
def f(x): return x * x
關鍵字lambda
表示匿名函數,冒號前面的x
表示函數參數。
匿名函數有個限制,就是只能有一個表達式,不用寫return
,返回值就是該表達式的結果。
四、裝飾器
https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001386819879946007bbf6ad052463ab18034f0254bf355000
五、偏函數
使用functools裏的partial建立偏函數
>>> import functools >>> int2 = functools.partial(int, base=2) >>> int2(‘1000000‘) 64 >>> int2(‘1010101‘) 85
functools.partial
的作用就是,把一個函數的某些參數給固定住(也就是設置默認值),返回一個新的函數,調用這個新函數會更簡單。
Python之函數式編程