Python學習筆記 - filter,map,reduce,zip

MADAO是不會開花的發表於2019-01-07

1. filter

filter函式用於過濾可迭代物件。它的語法是這樣的:

filter(function or None, iterable) --> filter object
複製程式碼

第一個引數是一個函式,第二個引數是一個可迭代物件。filter函式會根據第一個引數返回True還是False來決定第二個引數中每一項元素是否保留,它返回的是一個filter物件。

例子:

Python學習筆記 - filter,map,reduce,zip

filter物件是一個迭代器,它由惰性運算的特性。如果想要得到一個list型別的函式,的藉助list函式

Python學習筆記 - filter,map,reduce,zip

2. map

map函式的語法是:

map(func, *iterables) --> map object
複製程式碼

我理解的它的作用就是,遍歷一個(多個)可迭代物件,然後對這個可迭代物件中的每一個元素都執行傳入的函式,並把結果作為最終返回的map物件中的元素。

例子:

list_1 = [1, 2, 3, 4, 5]
list_2 = [9, 8, 7, 6, 5]

new_list_1 = map(lambda i: i**2, list_1)
new_list_2 = map(lambda x, y: x + y, list_1, list_2)

print(list(new_list_1))  # [1, 4, 9, 16, 25]
print(list(new_list_2))  # [10, 10, 10, 10, 10]
複製程式碼

從例子中可以看出map是可以接受多個可迭代物件的。

3. reduce

reduce 不能直接使用,必須從functools模組中匯入(python3中):

from functools import reduce

help(reduce)
複製程式碼

它的語法是這樣的:

reduce(function, sequence[, initial]) -> value
複製程式碼

它接受三個引數,第一個是一個函式,第二個是一個可迭代物件,第三個是個可選引數,初始值,reduce的作用直接看官方解釋,我有點不知道怎麼說:

Apply a function of two arguments cumulatively to the items of a sequence,
from left to right, so as to reduce the sequence to a single value.
For example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) calculates
((((1+2)+3)+4)+5).  If initial is present, it is placed before the items
of the sequence in the calculation, and serves as a default when the
sequence is empty.
複製程式碼

直接看例子:

from functools import reduce

nums = reduce(lambda x, y: x + y, [1,2,3,4,5])
print(nums)
'''
reduce 計算的過程可以理解為下面這樣:
(((1 + 2) + 3) + 4) + 5
'''

nums = reduce(lambda x, y: x - y, [1,2,3,4,5])
print(nums)

'''
reduce 計算的過程可以理解為下面這樣:
(((1 - 2) - 3) - 4) - 5
'''
複製程式碼

如果加上initial引數就是這樣:

from functools import reduce

nums = reduce(lambda x, y: x + y, [1,2,3,4,5], 1)
print(nums)
'''
reduce 計算的過程可以理解為下面這樣:
((((1 + 1) + 2) + 3) + 4) + 5
'''

nums = reduce(lambda x, y: x - y, [1,2,3,4,5], 1)
print(nums)

'''
reduce 計算的過程可以理解為下面這樣:
((((1 -1) - 2) - 3) - 4) - 5
'''
複製程式碼

4. zip

zip函式的語法是這樣的:

zip(iter1 [,iter2 [...]]) --> zip object
複製程式碼

作用直接看例子:

zip_example = zip((1,2,3), (3,2,1))
print(list(zip_example)) # [(1, 3), (2, 2), (3, 1)]
複製程式碼

zip將兩個元組(只要是可迭代物件就可以)合併了,合併對應關係是:

(1, 2, 3)
 ↓  ↓  ↓
(3, 2, 1)
    ↓↓
(1, 3), (2, 2), (3, 1)
複製程式碼

注意zip返回的是zip物件,也是一個迭代器,如果想要列表型別,還是得用list函式進行轉換。

使用zip可以輕鬆的將字典的key和value對換:

dict_a = {
    'a': 'aaa',
    'b': 'bbb',
    'c': 'ccc'
}
zip_example = zip(dict_a.values(), dict_a.keys())
print(dict(zip_example))  # {'aaa': 'a', 'bbb': 'b', 'ccc': 'c'}
複製程式碼

還有一個用法就是用*

zip_example = list(zip((1,2,3), (3,2,1), (3,2,1))) 
print(zip_example) # [(1, 3, 3), (2, 2, 2), (3, 1, 1)]

zip_example_restore = list(zip(*zip_example))
print(zip_example_restore) # [(1, 2, 3), (3, 2, 1), (3, 2, 1)]
複製程式碼

給zip的引數加上*之後就好像是zip逆過程一樣。

相關文章