Python/filter、map、reduce的應用

Python中filter、map、reduce應用


一、理解迭代器

  迭代器迭代器(iterator)是一種對象,它能夠用來遍歷標準模板庫容器中的部分或全部元素,每個迭代器對象代表容器中的確定的地址。迭代器修改了常規指針的接口,所謂迭代器是一種概念上的抽象:那些行爲上像迭代器的東西都可以叫做迭代器。然而迭代器有很多不同的能力,它可以把抽象容器和通用算法有機的統一起來。是一種對象,它能夠用來遍歷標準模板庫容器中的部分或全部元素,每個迭代器對象代表容器中的確定的地址。迭代器修改了常規指針的接口,所謂迭代器是一種概念上的抽象:那些行爲上像迭代器的東西都可以叫做迭代器。然而迭代器有很多不同的能力,它可以把抽象容器和通用算法有機的統一起來。

1.1、map()

  返回一個迭代器,該迭代器將函數應用於iterable的每一項,生成結果。如果傳遞了額外的可迭代參數,函數必須接受那麼多參數,並並行地應用於所有可迭代的項。對於多個迭代器,當最短的迭代器耗盡時,迭代器停止。對於函數輸入已經安排爲參數元組的情況,可能看了以上解釋,乍一眼看上去,可能狗屁不通,後續會介紹迭代器、生成器以及可迭代對象的一些概念。

1.2、map()的用法

  在使用map之前,首先了解iterable是什麼意思。 其實我們在這裏可以把iterable當做一個列表,現在只需要知道iterable是一個列表,一個序列就可以了,它能自動的把序列中的每一個值映射到相應的函數中,最後得到值。接下來看看map在python中的語法:

map(function, iterable, ...)
例1:

  例如,現在有一個列表,那麼列表就是一個序列,可以理解爲:iterable,在map語法中是 map(function, iterable)現在就知道map(function, 列表) 的這麼一個語法。目前有一個numbers的列表 其中有1、3、5、7、9 數字。 要求把13579變成246810 最後傳入到新的列表並輸出如下:

numbers = [1, 3, 5, 7, 9] # 定義一個列表中有1、3、5、7、9
result_numbers = [] # 定義一個空的列表,來接收最後的結果
for i in numbers: # 通過for i in 循環 numbers 列表 得到每一個數字
    number = i + 1 # 每一個數字都+1 賦值給新的number變量 
    result_numbers.append(number) # 通過result_numbers.append 添加到新的列表

print(result_numbers)  # 最後輸出打印結果
>>> [2, 4, 6, 8, 10]
通過map來實現:
numbers = [1, 3, 5, 7, 9]  # 定義一個列表中有1、3、5、7、9
def add(x): # 定義一個add函數,x爲值
    return x + 1 # 返回一個 x + 1

print(list(map(add, numbers))) # map(add:函數的功能, numbers:一個序列,列表)
>>> [2, 4, 6, 8, 10]

  首先定義了一個numbers的列表裏面有1、3、5、7、9 接下來定義了一個函數爲add 在後面括號中添加一個值。首先我們在調用函數的時候,我們要傳一個值得時候我們需要在函數參數中定義一個值,如果兩個就定義兩個值。此函數的功能就是x + 1 那麼x就是一個值,那麼這個值來源於numbers列表中的值。當我們使用map方法,第一個參數爲function也就是函數,第二個參數爲序列也可以理解爲列表。 完全可以理解,將numbers列表中的值,一一的取到add函數中 最後通過x + 1的功能得出最後的結果。

map例2:
name = ("yankerp", "zhangsan", "lisi")
def upt(x):
    return x.upper()

print(tuple(map(upt, name)))
>>> ('YANKERP', 'ZHANGSAN', 'LISI')

2.1、filter()

  簡單理解,filter就是一個過濾的意思,也就是添加一些篩選條件,從iterable的那些元素構造一個迭代器,函數返回true。iterable可以是序列,支持迭代的容器,也可以是迭代器。如果功能是None,同樣的函數被假定,那就是,所有的元素迭代是假的被刪除。filter語法如下:

filter(function, iterable)

例如:我們在一個列表中有很多不同的數字。要求找到大於50 小於 70的數字。如下:

my_list = [2, 3, 23, 34, 45, 56, 67, 88, 21, 22, 13, 15, 16] # 定義一個數字列表
numbers = [] # 定義一個numbers空列表
for i in my_list: # 循環空列表的每一個值
    if 50 < i < 70: # 附加判斷條件
        numbers.append(i) # 將條件成立的加入到新的列表中
        
print(numbers) # 最後輸出結果
>>> [56, 67]
通過filter來實現:
my_list = [2, 3, 23, 34, 45, 56, 67, 88, 21, 22, 13, 15, 16] # 定義一個數字列表
def judge(x): # 定義一個judge函數,添加x參數
    if 50 < x < 70: # 定義判斷條件
        return True # 若條件成立返回True 無找到就返回None

print(list(filter(judge, my_list))) # 輸出最後的結果
>>> [56, 67]
filter例2:
name = ["yankerp", "yankai", "yanzan", "zhangsan", "lisi", "wangwu"]
import re
def seach(x):
    if re.search("yan", x):
        return True
print(list(filter(seach, name)))
>>> ['yankerp', 'yankai', 'yanzan']

3.1、reduce()

  是減少 縮小 降低的意思,應用功能的兩個參數來累計的項目序列,從左至右,這樣的順序,以減少單個值。例如,reduce(lambda x, y: x+y, [1, 2, 3, 4, 5])計算((((1+2)+3)+4)+5)。左參數x是累加值,右參數y是序列的更新值。如果存在可選的初始值設定項,則它將位於計算中序列的項之前,並在序列爲空時用作默認值。如果未給出初始化程序且序列僅包含一個項目,則返回第一個項目。
例如:目前有一個數字列表,需要把每個數字都+ - * / 如下:

from functools import reduce
numbers = [2, 3, 23, 34, 45, 56, 67, 88, 21, 22, 13, 15, 16]
Count = 0
for i in numbers:
    Count+=i
print(Count)
>>> 405
reduce例1:
from functools import reduce
numbers = [2, 3, 23, 34, 45, 56, 67, 88, 21, 22, 13, 15, 16]
def add(x, y):
    return x+y
reduce(add, numbers)
>>> 405
reduce例2:
from functools import reduce
numbers = ['a','b','x']
def add(x, y):
    return x+y
reduce(add, numbers)
>>> 'abx'
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章