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']]
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課程~那麼,就祝大家學習愉快!