Python map以及reduce函數

# -*- coding: utf-8 -*-
# 函數作爲參數傳入,這樣的函數稱爲高階函數,函數式編程就是指這種高度抽象的編程範式
from functools import reduce


def normalize(name):
   name = str.capitalize(name)
   return name


l1 = ['adam', 'LISA', 'barTa']
l2 = list(map(normalize, l1))  # map(函數,Iterable):將函數一次作用到每個元素,並將結果作爲新的Iterator返回。
print(l2)


def prod(l):
   def fm(x, y):
      return x * y
   return reduce(fm, l)  # reduce(函數,序列):reduce必須接收兩個參數,把結果繼續和序列的下個元素累積計算。


print('3 * 5 * 7 * 9 =', prod([3, 5, 7, 9]))
if prod([3, 5, 7, 9]) == 945:
   print('測試成功!')
else:
   print('測試失敗!')


def str2float(c):
   # 將字符轉換成數字
   def str2num(c):
      return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[c]

   # 將獲取到的數字列表進行排序
   def fa(a, b):
      return a*10 + b

   # 將獲取到的數字列表進行小數點後排序
   def fb(a, b):
      return a/10 + b

   cindex = c.index('.')  # 獲取小數點的索引位置

 # reduce(fa, map(str2num, c[:cindex])) + reduce(fa, map(str2num, c[(cindex+1):]))/10**len(c[(cindex+1):]))

   return reduce(fa, map(str2num, c[:cindex])) + reduce(fb, map(str2num, c[(cindex+1):][::-1]))/10


""""   
第一種計算方法不需要用到fb函數,reduce(fa, map(str2num, c[:cindex])),
首先map函數將原字符串小數點前的字符串通過str2num函數轉換成相應的數字列表[1,3,5,6],
然後reduce函數通過fa函數將獲取到的參數進行排序以此獲得整數部分的數值例如1356.3645,
這個時候獲取到的數值將爲:1356,
map(str2num, c[(cindex+1):])從cindex+1位開始獲取字符通過str2num將字符轉化爲數字列表[3,6,4,5],
通過reduce函數排序,獲取到的數值爲:3645
10**len(c[(cindex+1):])):**乘方運算,這裏是通過獲取字符串長度決定10的乘方數,將上面獲取的3645/(10*10*10*10),
然後獲得小數部分的數值:0.3645
最後將1356+0.3645的結果返回

第二種與第二種的區別在於小數部分的處理,第一種方法直接獲取字符後組裝成相應的數字通過除法,
將排序好的數字轉成想要的小數部分的數值,第二種直接將獲取到的字符轉化成數字後/10變成小數然後排序.
但是如果直接[3,6,4,5] 通過fb函數排序的話那得到的結果將是:
0/10+3=3>>>3/10+3=6.3>>>6.3/10+4=4.63>>>4.63/10+5=5.463/10=0.5463,
所以在這裏需要通過[::-1]進行倒序處理之後再排序轉化成我們要的小數部分,具體如下:
map(str2num, c[(cindex+1):][::-1]))小數點的索引位+1開始獲取字符串,
然後倒序傳入str2num函數(例如1356.3645),這裏經過倒序處理後將爲:[5,4,6,3],
然後通過fb函數將獲取的數字按照0/10+5>>>5/10+4=4.5>>>4.5/10+6=6.45>>>
6.45/10+3=3.645,最後再將3.645/10獲得小數部分:0.3645
list[::-1]表示從最後一個索引位倒序獲取字符組成一個list
list[4::1]從第4個索引位倒序獲取字符,[1,3,4,52,32,11,1,1,]>>>[32,52,1,4,3,1]
最後將整數部+小數部分 1356+0.3645=1356.3645
"""

print('str2float(\'123.456\')=', str2float('123.456'))
if abs(str2float('123.456') - 123.456) < 0.00001:
   print('測試成功!')
else:
   print('測試失敗!')
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章