Python基礎應用:map與reduce

2021-02-19 量化金融分析師

Python 雖然是面向對象的語言,但其設計中融入多種編程範式的思想,使 Python 具有很大的靈活性。map()和 reduce() 函數的設計靈感就來源於函數式編程的思想。

簡單講,函數式編程的主要思想是儘量將運算過程編寫成一系列的嵌套函數。 map() 和 reduce() 都是Python內置的高階函數。所謂高階函數,即以函數作為輸入參數或輸出結果的函數,map() 和 reduce()的共同特徵是以函數作為傳入參數。

從運行效率的角度講,map()等其他python內置函數是效率最高的,其次是列表解析,再次是生成器和for循環,while循環最慢。

以下是map()和reduce()的使用方法和例子:

In [1]:

# map() 最常見的用法是對列表做映射
l = [ i for i in range(9)]
print('l: ', l)
print('\n')

# 將匿名函數作為參數傳遞給map()函數
# 匿名函數相關內容詳見 Python基礎應用之匿名函數
# 匿名函數實現的功能是返回傳入參數的平方
# map()函數實現的功能是將平方運算映射到列表 l 的每一項上
# Python3 以後map()函數的返回值是一個map對象,使用list()函數將map對象轉化為list對象可以看到具體輸出結果
l_sqr = map(lambda x: x**2, l)
print('l_sqr: ', list(l_sqr))

Out[1]:
l:  [0, 1, 2, 3, 4, 5, 6, 7, 8]

l_sqr:  [0, 1, 4, 9, 16, 25, 36, 49, 64]

In [2]:

# map() 函數可以接收多個可迭代對象做並行運算
import pandas as pd
name = ['Sheldon Cooper', 'Leonard Hofstadter', 'Howard Wolowitz', 'Rajesh Koothrappali']
tel = ['8341-2579', '8643-5429', '8878-6432', '8571-2612']# 定義一個函數,作為參數傳遞給 map() 函數
# 函數的功能是輸入名字和電話,將名字分拆成姓和名,然後與電話號碼組合成一個list輸出
def parse_name(name, tel):first_name, last_name = name.split(' ')return [first_name, last_name, tel]

# 簡單參數測試一下
single_output = parse_name('Sheldon Cooper', '38467')
print('single_output: ', single_output)
print('\n')

# parse_name 函數作為參數傳遞給 map() 函數,其餘參數是用於並行計算的多個列表# 所謂並行計算,就是對多個可迭代對象對應位置上的元素做運算
phone_book = map(parse_name, name, tel)
l = list(phone_book)
print('phone_book: ', l)
print('\n')

# 進一步轉化為pandas dataframe
df = pd.DataFrame(l, columns=['First_Name', 'Last_Name', 'Tel_No'])
df


Out[2]:

single_output:  ['Sheldon', 'Cooper', '38467']phone_book:  [['Sheldon', 'Cooper', '8341-2579'], ['Leonard', 'Hofstadter', '8643-5429'], ['Howard', 'Wolowitz', '8878-6432'], ['Rajesh', 'Koothrappali', '8571-2612']]


First_NameLast_NameTel_No0SheldonCooper8341-25791LeonardHofstadter8643-54292HowardWolowitz8878-64323RajeshKoothrappali8571-2612

In [3]:

# 使用 reduce() 函數需要從 functools 模塊導入
from functools import reduce
l =  [0, 1, 2, 3, 4, 5, 6, 7, 8]

# reduce() 函數需要兩個參數,第一個參數是一個函數,第二個參數是一個可迭代對象
# reduce() 函數的作用是將可迭代對象的前兩個元素作為參數傳遞給回調函數,
# 再將結果和第三個元素一起,再次作為參數傳給回調函數,以此類推直到可迭代對象元素用盡返回結果
# 此處將匿名函數作為參數傳遞給 reduce() 函數,匿名函數的作用是對傳入的參數求和
# 所以 reduce() 整體的作用是對整個列表做累加,得到的是一個數值結果(scalar value)
l_sum = reduce(lambda x, y: x + y, l)
l_sum

Out[3]:

36

In [4]:

# reduce() 也可以接受第三個參數作為迭代初始值,這樣最初傳入回調函數的會是第三個參數和可迭代對象的第一個元素
l_sum2 = reduce(lambda x,y: x + y, l , 100)
l_sum2

Out[4]:

136

In [5]:

# 應用實例
# 使用 map() 函數將代碼後綴截掉
codes = ['300243.XSHE', '002504.XSHE', '300173.XSHE', '300023.XSHE', '600145.XSHG']
codes_map = map(lambda x: x[:6], codes)
print('codes_map: ', list(codes_map))
print('\n')

# 此處功能比較簡單,用列表解析也可以實現,如果對元素操作複雜則更多單獨定義函最美的時光遇見你
在最美的年華,遇到一個愛你的人,縱使剎那盛開,瞬間凋零,以一世痴念,守一場心靈的地老天荒,何嘗不是一種無以倫比的幸福?三千痴纏,只為一人,掬一捧旖旎心事,無論花開花謝,情,都會以一樹執念,絢爛成靈魂的永恆。數,然後用map()映射
# 列表解析相關內容見 《Python基礎應用之列表解析》
codes_comprehension = [code[:6] for code in codes]
print('codes_comprehension: ', codes_short_comprehension)

Out[5]:

codes_map:  ['300243', '002504', '300173', '300023', '600145']
codes_comprehension:  ['300243', '002504', '300173', '300023', '600145']

以上是Python基礎應用:map與reduce,覺得難不難?零基礎到入門,小編目測你命裡就缺Python金融實戰應用,線上線下同時進行,還有金程男神紀慧誠老師加持,入門Python穩的一批!

附上GIF動圖版,讓你能更直觀了解AQF課程~那麼,就祝大家學習愉快!

相關焦點

  • Python入門基礎之map()、reduce()函數使用
    本文環境都是基於python3.X的,畢竟要學會擁抱未來,擁抱新的知識。Python3 現在已經發展的差不多了。1、 map()函數map()是 python 內置的高階函數,它接收一個函數 f 和一個 list,並通過把函數 f 依次作用在 list 的每個元素上,得到一個新的object並返回。
  • python高階函數:map、filter、reduce的替代品
    高階函數是一種將函數作為參數,或者把函數作為結果返回的函數,map函數、sorted函數就是高階函數的典型例子。map函數在小編以前的文章中做過相應的知識分享。sorted函數是python的內置函數,它的可選參數key用於提供一個函數,它可以將函數應用到各個元素上進行排序。
  • 一文讀懂python的map、reduce函數
    這篇文章講的是Python的map、reduce兩大函數。
  • Python 進階之術 Map Filter Reduce
    這是它的規範:規範map(function_to_apply, list_of_inputs)⼤多數時候,我們要把列表中所有元素⼀個個地傳遞給⼀個函數,並收集輸出。就是這樣:items = [1, 2, 3, 4, 5]squared = list(map(lambda x: x**2, items))⼤多數時候,我們使⽤匿名函數(lambdas)來配合 map不僅⽤於⼀列表的輸⼊, 我們甚⾄可以⽤於⼀列表的函數
  • Python編程技巧:如何用Map, Filter, Reduce代替For循環?
    map、filter 和 reduce 這三種技術可以提供描述迭代原因的函數替代方案,以便避免過多的 for 循環。我之前在 JavaScript 中寫過這些技術的入門文章,但是它們在 Python 中的實現略有不同。
  • python3 map、reduce、filter 的區別
    、reduce、filter 這樣的高階函數(遍歷序列):接收兩個參數,一個是函數,一個是 Iterable,map 將傳入的函數依次作用到序列的每個元素,並把結果作為新的 Iterator 返回reduce
  • python高階函數學習, map、reduce
    函數map():map()函數接收兩個參數,一個是函數,一個是Iterable, map把函數作用於序列的每一個元素,並把結果作為Iterator返回。注意,返回的是生成器Iterator,所以取返回值的時候需要用for,或者next,或者通過list序列化之後才能取出來舉例:def f(x): return x * x #定義一個函數f(x),返回值是兩個數的乘積r = map(f, [1, 2, 3, 4, 5, 6]) #通過map函數讓f(x)作用於後面序列的每一個元素
  • 如何用Map、Filter和Reduce替換Python For循環?
    基於這種觀點,這三種方法是識別和實現,因為循環迭代的原因通常對應以下三種功能類型之一:· Map:對每個項應用相同的步驟集,儲存結果。· Filter: 應用驗證條件,儲存計算值為True的項。
  • 「python」高階函數map、reduce的介紹
    Pythonmap先看官方介紹:map(function, iterable, ...)很基礎,解釋的有點多餘....a是個列表(可迭代對象)。當執行了3次next(b)後,(b是迭代器)此時的結果只有後面7個元素了,因此list(b)只輸出了3-9的ljds(x)。
  • 5分鐘掌握Python | Map、Reduce和Filter如何運用?
    今天給大家介紹的是Python當中三個非常神奇的方法:map、reduce和filter。Map除了地圖之外,另一個英文本意是映射。在C++和Java一些語言當中,將map進一步引申成了存儲key和value映射結構的容器。
  • Python專題——五分鐘帶你了解map、reduce和filter
    今天是Python專題第6篇文章,給大家介紹的是Python當中三個非常神奇的方法:map、reduce和filter。不知道大家看到map和reduce的時候有沒有什麼感覺,如果看過之前我們大數據系列介紹MapReduce文章的同學,想必有些印象。這個MapReduce不是一個分布式的計算方法麼,怎麼又變成Python中的方法了?
  • 詳解Python函數式編程之map、reduce、filter
    map()、reduce()、filter()是Python中很常用的幾個函數,也是Python支持函數式編程的重要體現。
  • 一文看懂Python列表表達式及高階函數如lamda, zip, enumerate, map和filter方法.
    深入了解和熟練使用python的列表表達式和內置的一些高階函數如lamda, zip, enumerate, map, filter, reduce
  • JavaScript 關於map,reduce函數的一些思考
    map函數與reduce函數屬於函數式編程,通俗點說,可以把函數作為參數或返回值自由傳遞。
  • 圖解 Map、Reduce 和 Filter 數組方法
    Array.map()Array.map() 根據傳遞的轉換函數,更新給定數組中的每個值,並返回一個相同長度的新數組。它接受一個回調函數作為參數,用以執行轉換過程。let newArray = oldArray.map((value, index, array) => { ...
  • 在Python中使用Reduce函數
    其中一些工具包括 map()、 filter()和 reduce()函數。在文中,我們將探索reduce()函數並闡明其提供的多功能性和實用性。使用for循環介紹reduce()函數的最好的方式是從實際問題入手,並嘗試用老式的方法解決它,即使用for循環。
  • 用reduce 實現map方法
    reduce & mapreduce是一個累加方法,是對數組累積執行回調函數,返回最終計算的結果
  • 從打牌到map-reduce工作原理解析
    【map-reduce】呂老師:hadoop是一個分布式計算平臺,我們只要開發map-reduce的作業(job),然後提交到hadoop平臺,它就會幫我們跑這個map-reduce的作業啦。小史:我明白了,hadoop其實把map-reduce的流程已經固定下來並且實現了,只留給我們自定義map和自定義reduce的接口,而這兩部分恰好是和業務強相關的。
  • 案例詳解:filter 過濾、map 映射、reduce累積
    map()函數接收兩個參數,一個是函數,一個是Iterable(可迭代對象),map將傳入的函數依次作用到序列的每個元素,並把結果作為新的Iterator返回。map() 函數語法:    map(function, iterable, ...)
  • 漫畫:從打牌到 map-reduce 工作原理解析
    呂老師:Hadoop 是一個分布式計算平臺,我們只要開發 map-reduce 的作業(job),然後提交到 Hadoop 平臺,它就會幫我們跑這個 map-reduce 的作業啦。小史:我明白了,Hadoop 其實把 map-reduce 的流程已經固定下來並且實現了,只留給我們自定義 map 和自定義 reduce 的接口,而這兩部分恰好是和業務強相關的。