首頁 > 軟體

Python學習之魔法函數(filter,map,reduce)詳解

2022-04-02 10:01:13

今天的這一章節我們來學習一下,Python 中的三個高階函數,也被稱之為 魔法函數。之所以把他們交的這麼高階,主要是因為它們返回的資料型別多數是 迭代器。

我們在上一章節有介紹過,迭代器 可以提升我們的程式碼的執行效率、降低記憶體消耗。所以接下來我們就認識一下這些 魔法函數。

filter() 函數

filter() 函數 是python的一個內建函數。

filter() 函數的功能:可以將一個可遍歷的物件根據過濾條件,生成一個迭代器。(在python2.7版本,返回的是列表)

filter() 函數的使用方法:

用法:

filter(function, list)

引數介紹:

function:對list的每個item進行條件過濾的定義(主要對第二引數的每個成員進行判斷,滿足函數的要求,將會進入 filter 生成的迭代器)

list:需要過濾的列表 (其實這裡不一定只可以放列表,放入的是可迭代物件)

演示案例如下(過濾出列表中的所有偶數):

def is_even(n):
    return n % 2 == 0


newlist = filter(is_even, [1, 2, 3, 4, 5, 6])
print(newlist, type(newlist))

# >>> 執行結果如下:
# >>> <filter object at 0x7fb241492310> <class 'filter'>

for i in newlist:
    print(i)

# >>> 執行結果如下:
# >>> 2
# >>> 4
# >>> 6

PS:需要注意的是,這裡的非偶數,雖然會被過濾函數拋棄,但是依然會存在於之前的列表中。

map() 函數

map() 函數 是python的一個內建函數。

map() 函數的功能:對列表中的每一個成員依次執行函數進行判斷,將執行的結果放到新 list 中,返回一個 map 對應的物件。

map() 函數的使用方法:

用法:

map(function, list)

引數介紹:

function:對 list 每個 item 進行條件滿足的判斷

list:需要過濾的列表 (其實這裡不一定只可以放列表,放入的是可迭代物件)

演示案例如下(對列表中的每一個成員判斷是否大於1):

result = map(lambda x: x>1, [0, 1, 2, 3])

print(result, type(result))

# >>> 執行結果如下:
# >>> <map object at 0x7facfa399e80> <class 'map'>

for i in result:
    print(i)
    
# >>> 執行結果如下:
# >>> False
# >>> False
# >>> True
# >>> True

reduce() 函數

reduce() 函數 以前是python的一個內建函數,現在不是了。(在python 2.x版本的時候,reduce() 函數可以直接被呼叫;但是在 python 3.x 的版本中,由於返回的不是一個迭代器,所以需要先執行匯入然後才可以繼續使用。匯入語句 from functools import reduce)

reduce() 函數 的功能:對迴圈前後的兩個資料進行累加或者累乘。(實際上可以通過 lambda 對這兩個成員進行任何的處理)

reduce() 函數的使用方法:

用法:

reduce(function, list)

引數介紹:

function:對資料累加/累成的函數

list:需要過濾的列表 (其實這裡不一定只可以放列表,放入的是可迭代物件)

演示案例如下(對迴圈前後的兩個資料進行累加或者累乘):

from functools import reduce

result = reduce(lambda x, y: x + y, [1, 2, 3])

print(result, '---', type(result))

# >>> 執行結果如下:
# >>> 6 --- <class 'int'>


from functools import reduce


result = reduce(lambda x, y: x * y, [1, 3, 5])

print(result, '---', type(result))

# >>> 執行結果如下:
# >>> 15 --- <class 'int'>

filter() 函數 小實戰

scores = [("張三", 89, 90, 59),
          ("李四", 99, 49, 59),
          ("趙五", 99, 60, 20),
          ("王二麻子", 40, 94, 59),
          ("李雷", 89, 90, 59),
          ("李莉", 89, 90, 69),
          ("楚浠", 79, 90, 59),
          ("Neo", 85, 90, 59),
          ("Abby", 89, 91, 90)]

def handle_filter(a):
    s = sorted(a[1:])   # 對三科成績進行排序
    
    # 有 2 科成績在 80 分以上,並且有 1 科在 60 分以下的
    if s[-2] > 80 and s[0] < 60:
        return True
    
    # 有 1 科成績在 90 分以上,另外 2 科成績都在 60 分以下
    if s[-1] > 90 and s[1] < 60:
        return True
    if s[-2] > 80 and sum(s)/len(s) < 60:
    
    # 有 1 科成績在 90 分以上, 且 3 科的平均分在 70 分以下
        return True
    return False


newIter = list(filter(handle_filter, scores))
print(newIter)

# >>> 執行結果如下:
# >>> [('張三', 89, 90, 59), ('李四', 99, 49, 59), ('王二麻子', 40, 94, 59), ('李雷', 89, 90, 59), ('Neo', 85, 90, 59)]

到此這篇關於Python學習之魔法函數(filter,map,reduce)詳解的文章就介紹到這了,更多相關Python filter() map() reduce()內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com