函數(shù)式編程1

高階函數(shù)

map

map()函數(shù)接收兩個參數(shù),一個是函數(shù),一個是Iterablemap將傳入的函數(shù)依次作用到序列的每個元素,并把結(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把一個函數(shù)作用在一個序列[x1, x2, x3, ...]上,這個函數(shù)必須接收兩個參數(shù),reduce把結(jié)果繼續(xù)和序列的下一個元素做累積計算,其效果就是: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()也接收一個函數(shù)和一個序列。和map()不同的是,filter()把傳入的函數(shù)依次作用于每個元素,然后根據(jù)返回值是True還是False決定保留還是丟棄該元素。
注意到filter()函數(shù)返回的是一個Iterator,也就是一個惰性序列,所以要強(qiáng)迫filter()完成計算結(jié)果,需要用list()函數(shù)獲得所有結(jié)果并返回list。

用filter求素數(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():#不斷返回下一個素數(shù)
    yield 2
    it = _odd_iter() # 初始序列
    while True:
        n = next(it) # 返回序列的第一個數(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

回數(shù)是指從左向右讀和從右向左讀都是一樣的數(shù),例如12321,909。請利用filter()篩選出回數(shù):

def is_palindrome(n):
    return n==int(str(n)[::-1])

sorted

排序也是在程序中經(jīng)常用到的算法。無論使用冒泡排序還是快速排序,排序的核心是比較兩個元素的大小。如果是數(shù)字,我們可以直接比較,但如果是字符串或者兩個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]
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容