高階函數(shù)
map
map()
函數(shù)接收兩個(gè)參數(shù)狱庇,一個(gè)是函數(shù)塘娶,一個(gè)是Iterable
约巷,map
將傳入的函數(shù)依次作用到序列的每個(gè)元素记某,并把結(jié)果作為新的Iterator
返回司训。
例子:將下列數(shù)字轉(zhuǎn)化為字符串
>>> list(map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
['1', '2', '3', '4', '5', '6', '7', '8', '9']
reduce
reduce
把一個(gè)函數(shù)作用在一個(gè)序列[x1, x2, x3, ...]
上,這個(gè)函數(shù)必須接收兩個(gè)參數(shù)液南,reduce
把結(jié)果繼續(xù)和序列的下一個(gè)元素做累積計(jì)算壳猜,其效果就是:reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
求和的例子:
>>> from functools import reduce
>>> def fn(x, y):
... return x * 10 + y
...
>>> reduce(fn, [2,4,46,5])
2865
還可以用lambda函數(shù)進(jìn)一步簡化成:
from functools import reduce
DIGITS = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}
def char2num(s):
return DIGITS[s]
def str2int(s):
return reduce(lambda x, y: x * 10 + y, map(char2num, s))
filter
Python內(nèi)建的filter()
函數(shù)用于過濾序列。
和map()
類似滑凉,filter()
也接收一個(gè)函數(shù)和一個(gè)序列统扳。和map()
不同的是,filter()
把傳入的函數(shù)依次作用于每個(gè)元素譬涡,然后根據(jù)返回值是True
還是False
決定保留還是丟棄該元素闪幽。
注意到filter()
函數(shù)返回的是一個(gè)Iterator
,也就是一個(gè)惰性序列涡匀,所以要強(qiáng)迫filter()
完成計(jì)算結(jié)果盯腌,需要用list()
函數(shù)獲得所有結(jié)果并返回list
。
用filter求素?cái)?shù)
def _odd_iter(): #生成器生成從3開始的無限奇數(shù)序列
n = 1
while True:
n = n + 2
yield n
def _not_divisible(n):#定義篩選函數(shù)
return lambda x: x % n > 0
def primes():#不斷返回下一個(gè)素?cái)?shù)
yield 2
it = _odd_iter() # 初始序列
while True:
n = next(it) # 返回序列的第一個(gè)數(shù)
yield n
it = filter(_not_divisible(n), it) # 構(gòu)造新序列
for n in primes():#只輸出1000以內(nèi)
if n < 1000:
print(n)
else:
break
回?cái)?shù)是指從左向右讀和從右向左讀都是一樣的數(shù)陨瘩,例如12321腕够,909级乍。請利用filter()
篩選出回?cái)?shù):
def is_palindrome(n):
return n==int(str(n)[::-1])
sorted
排序也是在程序中經(jīng)常用到的算法。無論使用冒泡排序還是快速排序帚湘,排序的核心是比較兩個(gè)元素的大小玫荣。如果是數(shù)字,我們可以直接比較大诸,但如果是字符串或者兩個(gè)dict呢捅厂?直接比較數(shù)學(xué)上的大小是沒有意義的,因此资柔,比較的過程必須通過函數(shù)抽象出來焙贷。
Python內(nèi)置的sorted()
函數(shù)就可以對list進(jìn)行排序.
>>> sorted([36, 5, -12, 9, -21], key=abs) #按絕對值大小排
[5, 9, -12, -21, 36]