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
None
, func
表現為一個身份函式,返回 一個含有每個序列中元素集合的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