1. 程式人生 > 實用技巧 >python高階函式 filter,map,reduce使用

python高階函式 filter,map,reduce使用

目錄

filter(func, seq)

呼叫一個布林函式 func 來迭代遍歷每個 seq 中的元素; 返回一個使 func 返回值為 ture 的元素的序列

filter 函式為已知的序列的每個元素呼叫 給定布林函式。每個 filter 返回的非零(true)值元素新增到一個列表中。返回的物件是一個從原 始佇列中“過濾後”的佇列

python程式碼寫filter()

函式,程式碼如下:

def filter(bool_func,seq):
    filtered_seq = [] # 存放過濾完元素的列表
    for eachitem in seq:
        if bool_func(each_item): # 如果過濾函式為真,則將元素加入filter_seq列表中
            filtered_seq.append(each_item)
    return filtered_seq

例項:

from random import randint

# 從1~99中取出隨機數目奇數

def odd(n):
    if n % 2:
        return n

ALL_NUMS = []

for _ in range(9):
    ALL_NUMS.append(randint(1,99))

print(ALL_NUMS)    

print(list(filter(odd,ALL_NUMS)))

除此,還可以將odd()改換成lambda表示式:

from random import randint

# 從1~99中取出隨機數目奇數

def odd(n):
    if n % 2:
        return n

ALL_NUMS = []

for _ in range(9):
    ALL_NUMS.append(randint(1,99))

print(ALL_NUMS)  
print(list[filter(lambda n:n % 2,ALL_NUMS)])

map(func, seq1[,seq2...])

將函式 func 作用於給定序列(s)的每個元素,並用一個列表來提 供返回值;如果 func

Nonefunc 表現為一個身份函式,返回 一個含有每個序列中元素集合的n個元組的列表。

python程式碼寫map()函式,程式碼如下:

def map(func,seq):
    maped_seq = []
    for eachitem in seq:
        maped_seq.append(func(eachitem))
    return maped_seq

map() 處理一個序列

# 構建l列表中每個元素加2的列表
l = [1,2,3,4,5,6,7,8,9]
print(list(map(lambda x : x + 2,l)))
# 對應的列表生成式
print([x + 2 for x in l])
# out: [3, 4, 5, 6, 7, 8, 9, 10, 11, 12]

# 構建0~9 每個元素的取平方列表
print(list(map(lambda x: x**2,range(10))))
# 對應的列表生成式
print([x**2 for x in range(10)])
# out:[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

map() 處理多個序列

map()處理多個序列的受,那麼 map()會並行地迭代每個序 列。在第一次呼叫時, map()會將每個序列的第一個元素捆綁到一個元組中, 將 func 函式作用到 map()上, 當 map()已經完成執行的時候,並將元組的結果返回到 mapped_seq 對映的,終以 整體返回的序列上

# 構建兩個列表相同索引上的元素的相加
list0 = [1,3,5]
list1 = [2,4,6]
print(list(map(lambda x, y: x + y, list0, list1)))
# 對應的列表生成式
print([list0[i] + list1[i] for i in range(len(list0))])
# out: [3, 7, 11]

# 構建兩個列表同一索引位置上元素的和差
print(list(map(lambda x,y: (x + y,x -y),list0,list1)))
# 對應的列表生成式
print([(list0[i] + list1[i],list0[i] - list1[i]) for i in range(len(list0))])
# out: [(3, -1), (7, -1), (11, -1)]

functools.reduce(function, iterable[, initializer])

將兩個引數的 function 從左至右積累地應用到 *iterable* 的條目,以便將該可迭代物件縮減為單一的值。 例如,reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) 是計算 ((((1+2)+3)+4)+5) 的值。 左邊的引數 x 是積累值而右邊的引數 y 則是來自 *iterable* 的更新值。 如果存在可選項 initializer,它會被放在參與計算的可迭代物件的條目之前,並在可迭代物件為空時作為預設值。 如果沒有給出 initializer 並且 *iterable* 僅包含一個條目,則將返回第一項

python程式碼寫reduce()函式,程式碼如下:

def reduce(function, iterable, initializer=None):
    it = iter(iterable)
    if initializer is None:
        value = next(it)
    else:
        value = initializer
    for element in it:
        value = function(value, element)
    return value

例項:

from functools import reduce

# 求一個序列之和
print(reduce(lambda x,y: x + y,[1,3,5,7,9]))

# 將一個[1,3,5,7,9]中元素合併成一個數13579
print(reduce(lambda x,y: x * 10 + y,[1,3,5,7,9]))

引用
[1]:python核心程式設計
[2]:https://docs.python.org/zh-cn/3/library/functools.html?highlight=reduce#functools.reduce
[3]:https://www.liaoxuefeng.com/wiki/1016959663602400/1017329367486080