map函式、filter函式、reduce函式
阿新 • • 發佈:2018-11-26
map函式
map函式的結構為 map(處理方法,可迭代物件) ,相當於for迴圈遍歷可迭代物件中的每一個元素,對每一個元素做指定操作,得到一個和原始資料順序相同的迭代器。(在Python3中最終得到的結果是一個迭代器,可以用list()函式轉化為列表,在Python2中map函式的結果就是一個列表。)
map函式例項
原始方法:
def map_test(array):
ret = []
for i in array:
res = i - 1
ret.append(res)
return ret
print(map_test( l))
採用下面這種方法較第一種方法更靈活,批量修改時只需要修改被呼叫函式即可。
l = [1, 2, 10, 11]
def reduce_one(x):
return x - 1
def map_test(func, array):
ret = []
for i in array:
res = func(i)
ret.append(res)
return ret
print(map_test(reduce_one, l))
採用匿名函式的方式會在靈活的基礎上更加簡潔:
l = [1, 2, 10, 11 ]
def map_test(func, array):
ret = []
for i in array:
ret.append(func(i))
return ret
print(map_test(lambda x: x - 1, l))
以map函式形式:
注意map函式返回的結果是一個迭代器
l = [1, 2, 10, 11]
res = map(lambda x: x - 1, l)
print(list(res))
filter函式
filter函式的結構為 filer(結果為布林值的函式,可迭代物件),相當於for迴圈遍歷可迭代物件中的每個元素,對每個元素進行指定判斷,如果結果為True則保留該元素,所得結果為一個迭代器。
filter函式例項
原始方法:
movie_people = ["ALucky", "AAlex", "ADog", "MB", "Adsa", "YY"]
def filter_test(array):
res = []
for i in array:
if not i.startswith("A"):
res.append(i)
return res
print(filter_test(movie_people))
較為靈活的方法:
def remove_A(x):
return x.startswith("A")
def filter_test(func, array):
ret = []
for i in array:
if not func(i):
ret.append(i)
return ret
movie_people = ["ALucky", "AAlex", "ADog", "MB", "Adsa", "YY"]
print(filter_test(remove_A, movie_people))
匿名函式寫法:
def filter_test(func, array):
ret = []
for i in array:
if not func(i):
ret.append(i)
return ret
movie_people = ["ALucky", "AAlex", "ADog", "MB", "Adsa", "YY"]
print(filter_test(lambda x: x.startswith("A"), movie_people))
filter函式寫法:
movie_people = ["ALucky", "AAlex", "ADog", "MB", "Adsa", "YY"]
res = filter(lambda x: not x.startswith("A"), movie_people)
print(list(res))
reduce函式
reduce函式結構為 reduce(函式,可迭代物件,初始值),相當於for遍歷可迭代物件中的每一個元素,將所有元素和初始值按照指定函式的操作執行,最終返回一個值。在Python3中reduce函式中呼叫reduce函式必須先匯入模組,即以from functools import reduce開頭。
reduce函式例項
原始方法:
def reduce_test(array, init=None):
if init == None:
res = array.pop(0)
for i in array:
res *= i
return res
else:
res = init
for i in array:
res *= i
return (res)
l = [1, 2, 3, 100]
print(reduce_test(l))
較靈活的方法:
def multi(x, y):
return (x * y)
def reduce_test(func, array, init=None):
if init == None:
res = array.pop(0)
for i in array:
res = func(res, i)
else:
res = init
for i in array:
res *= func(res, i)
return res
l = [1, 2, 3, 100]
print(reduce_test(multi, l))
匿名函式的寫法:
def reduce_test(func, array, init=None):
if init == None:
res = array.pop(0)
for i in array:
res = func(res, i)
else:
res = init
for i in array:
res = func(res, i)
return res
l = [1, 2, 3, 100]
print(reduce_test(lambda x, y: x * y, l))
reduce函式:
注意必須先匯入模組
l = [1, 2, 3, 100]
from functools import reduce
res = reduce(lambda x, y: x * y, l)
print(res)