量化金融分析師AQF課程丨Python 雖然是面向?qū)ο蟮恼Z言,但其設(shè)計中融入多種編程范式的思想,使 Python 具有很大的靈活性。map()和 reduce() 函數(shù)的設(shè)計靈感就來源于函數(shù)式編程的思想。
簡單講,函數(shù)式編程的主要思想是盡量將運算過程編寫成一系列的嵌套函數(shù)。 map() 和 reduce() 都是Python內(nèi)置的高階函數(shù)。所謂高階函數(shù),即以函數(shù)作為輸入?yún)?shù)或輸出結(jié)果的函數(shù),map() 和 reduce()的共同特征是以函數(shù)作為傳入?yún)?shù)。
從運行效率的角度講,map()等其他python內(nèi)置函數(shù)是效率較高的,其次是列表解析,再次是生成器和for循環(huán),while循環(huán)最慢。
以下是map()和reduce()的使用方法和例子:
In [1]:
# map() 最常見的用法是對列表做映射l = [ i for i in range(9)]print('l: ', l)print('\n')# 將匿名函數(shù)作為參數(shù)傳遞給map()函數(shù)# 匿名函數(shù)相關(guān)內(nèi)容詳見 Python基礎(chǔ)應(yīng)用之匿名函數(shù)# 匿名函數(shù)實現(xiàn)的功能是返回傳入?yún)?shù)的平方# map()函數(shù)實現(xiàn)的功能是將平方運算映射到列表 l 的每一項上# Python3 以后map()函數(shù)的返回值是一個map對象,使用list()函數(shù)將map對象轉(zhuǎn)化為list對象可以看到具體輸出結(jié)果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() 函數(shù)可以接收多個可迭代對象做并行運算import pandas as pdname = ['Sheldon Cooper', 'Leonard Hofstadter', 'Howard Wolowitz', 'Rajesh Koothrappali']tel = ['8341-2579', '8643-5429', '8878-6432', '8571-2612']# 定義一個函數(shù),作為參數(shù)傳遞給 map() 函數(shù)# 函數(shù)的功能是輸入名字和電話,將名字分拆成姓和名,然后與電話號碼組合成一個list輸出def parse_name(name, tel):
first_name, last_name = name.split(' ')return [first_name, last_name, tel]# 簡單參數(shù)測試一下single_output = parse_name('Sheldon Cooper', '38467')print('single_output: ', single_output)print('\n')# parse_name 函數(shù)作為參數(shù)傳遞給 map() 函數(shù),其余參數(shù)是用于并行計算的多個列表# 所謂并行計算,就是對多個可迭代對象對應(yīng)位置上的元素做運算phone_book = map(parse_name, name, tel)l = list(phone_book)print('phone_book: ', l)print('\n')# 進一步轉(zhuǎn)化為pandas dataframedf = 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_Name | Last_Name | Tel_No | |
|---|---|---|---|
| 0 | Sheldon | Cooper | 8341-2579 |
| 1 | Leonard | Hofstadter | 8643-5429 |
| 2 | Howard | Wolowitz | 8878-6432 |
| 3 | Rajesh | Koothrappali | 8571-2612 |
In [3]:
# 使用 reduce() 函數(shù)需要從 functools 模塊導(dǎo)入from functools import reducel = [0, 1, 2, 3, 4, 5, 6, 7, 8]# reduce() 函數(shù)需要兩個參數(shù),第一個參數(shù)是一個函數(shù),第二個參數(shù)是一個可迭代對象# reduce() 函數(shù)的作用是將可迭代對象的前兩個元素作為參數(shù)傳遞給回調(diào)函數(shù),# 再將結(jié)果和第三個元素一起,再次作為參數(shù)傳給回調(diào)函數(shù),以此類推直到可迭代對象元素用盡返回結(jié)果# 此處將匿名函數(shù)作為參數(shù)傳遞給 reduce() 函數(shù),匿名函數(shù)的作用是對傳入的參數(shù)求和# 所以 reduce() 整體的作用是對整個列表做累加,得到的是一個數(shù)值結(jié)果(scalar value)l_sum = reduce(lambda x, y: x + y, l)l_sum
Out[3]:
36
In [4]:
# reduce() 也可以接受第三個參數(shù)作為迭代初始值,這樣最初傳入回調(diào)函數(shù)的會是第三個參數(shù)和可迭代對象的第一個元素l_sum2 = reduce(lambda x,y: x + y, l , 100)l_sum2
Out[4]:
136
In [5]:
# 應(yīng)用實例# 使用 map() 函數(shù)將代碼后綴截掉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')# 此處功能比較簡單,用列表解析也可以實現(xiàn),如果對元素操作復(fù)雜則更多單獨定義函最美的時光遇見你在最美的年華,遇到一個愛你的人,縱使剎那盛開,瞬間凋零,以一世癡念,守一場心靈的地老天荒,何嘗不是一種無以倫比的幸福?三千癡纏,只為一人,掬一捧旖旎心事,無論花開花謝,情,都會以一樹執(zhí)念,絢爛成靈魂的永恒。數(shù),然后用map()映射# 列表解析相關(guān)內(nèi)容見 《Python基礎(chǔ)應(yīng)用之列表解析》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基礎(chǔ)應(yīng)用:map與reduce,覺得難不難?零基礎(chǔ)到入門,小編目測你命里就缺Python金融實戰(zhàn)應(yīng)用,線上線下同時進行,還有金程男神紀慧誠老師加持,入門Python穩(wěn)的一批!附上GIF動圖版,讓你能更直觀了解AQF課程~那么,就祝大家學習愉快!
.gif)
AQF考試群:760229148
量化金融AQF交流群:737550026
聲明▎更多內(nèi)容請關(guān)注微信號量化金融分析師。原創(chuàng)文章,歡迎分享,若需引用或轉(zhuǎn)載請保留此處信息。




