高階函數(shù)
map
map()函數(shù)接收兩個(gè)參數(shù),一個(gè)是函數(shù),一個(gè)是Iterable,map將傳入的函數(shù)依次作用到序列的每個(gè)元素,并把結(jié)果作為新的Iterator返回。
>>> 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)
比方說對(duì)一個(gè)序列求和,就可以用reduce實(shí)現(xiàn):
>>> from functools import reduce:
>>> def add(x, y):
... return x + y
...
>>> reduce(add, [1, 3, 5, 7, 9])
25
把字符串轉(zhuǎn)化為整數(shù)的函數(shù):
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))
strip()方法用于移除字符串頭尾指定的字符(默認(rèn)為空格)。
split()通過指定分隔符對(duì)字符串進(jìn)行切片。
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 _int_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():
it = _int_iter()#初始序列
while True:
n = next(it)#返回序列的第一個(gè)數(shù)
yield n
it = filter(_not_divisible(n), it)#構(gòu)造新序列
for n in primes():#構(gòu)造循環(huán)條件,使之可以輸出任何范圍的素?cái)?shù)序列
if n < 1000:
print(n)
else:
break
回?cái)?shù)是指從左向右讀和從右向左讀都是一樣的數(shù),例如12321,909。請(qǐng)利用filter()篩選出回?cái)?shù):
def is_palindrome(n):
return n==int(str(n)[::-1])
sorted
sorted()函數(shù)就可以對(duì)list進(jìn)行排序
此外,sorted()函數(shù)也是一個(gè)高階函數(shù),它還可以接收一個(gè)key函數(shù)來實(shí)現(xiàn)自定義的排序,例如按絕對(duì)值大小排序:
>>> sorted([36, 5, -12, 9, -21], key=abs)
[5, 9, -12, -21, 36]
key指定的函數(shù)將作用于list的每一個(gè)元素上,并根據(jù)key函數(shù)返回的結(jié)果進(jìn)行排序。