iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 16
0
Software Development

從0開始學習程式-Python系列 第 17

[Day20]lambda的三角督...filter(),map(),reduce()


今天天氣真的太適合睡覺了
床才是最邪惡的地方
但還是要繼續學習囉XD

lambda的三角督

  1. filter(function, iterable) function:
    filter()可以創造一個數列,利用function判斷在iterable中每一個元素後,回傳一個布林值,若為True,則會被存放在新的數列中。
    在這裡若我們直接再寫一個def function,反而會造成filter()的可讀性比較低,此時會選擇透過lambda來協助我們
val=[0,1,2,1,4,7,8,14,13,19,31,50]
fil_1=list(filter(lambda x: x%2 >0, val))
fil_2=list(filter(lambda x: 2**x >1024,fil_1))

print(fil_1) #output:[1, 1, 7, 13, 19, 31]
print(fil_2) #output:[13, 19, 31]

注意!對於python 3而言,filter()是一個迭代對象(iterable),並非list或者container

  1. reduce(function, iterable) function:
    reduce()顧名思義就是會將後面的迭代對象,逐項將iterable的每個元素利用function進行運算,簡化後回傳一個數值或答案

在 Python 2 中,reduce()放在__builtin__ 中,有時被稱為foldLeft,它代表一種高度抽象化後的流程,基於讓reduce成為更舉體化的function,在Python 3中,reduce()被移至funtoolsmodule。

from functools import reduce

val=[1,1,2,92,20,19,31,100,14]
red_1=reduce(lambda x,y: x if x>y else y, val)
print(red_1) #output:100
#利用前兩項進行運算的結果,再跟第三項運算,直到每個元素都用完
#operation:
#val=[1,1,2,92,20,19,31,100,14] -> val=[1,2,92,20,19,31,100,14] 
#-> val=[2,92,20,19,31,100,14] -> val=[92,20,19,31,100,14] ......
#-> val=[92,100,14] -> val=[100,14] -> val=[100]

red_2=reduce(lambda i,j: i*j, range(1,7))
print(fil_2) #output:720 #this method realizes factorial!
#operation:(((((1*2)*3)*4)*5)*6)

在網路上有看到一個動畫,可能會幫助大家理解reduce()的法,也提程式的實踐碼!

from functools import reduce
total=reduce(lambda x,y : x+y, range(6)
print(total) #output: 15

  1. map(function, iterable) function:
    這個函數可以想像,將iterable每一個元素透過function映射到另外一個空間。
base=[2,3,2,6,3,1,3]
w=[4,1,5,2,4,7,3]

mapping_1=map(lambda x: 3*x+2, base)
print(list(mapping_1)) 
#output:[8, 11, 8, 20, 11, 5, 11]

mapping_2=map(lambda x,y: x+y, base, w)
print(list(mapping_2)) 
#output:[6, 4, 7, 8, 7, 8, 6]

好啦~禮拜六維持我們輕鬆的態度過吧!
明天會講一下怎麼用lambda來幫助sorted()

肚子餓了~大家一起去吃飯吧XD
但今天還是想要給大家一個小小的練習

Jason某堂課的各項成績為score,而各項比重在weight,請計算Jason該科目學習成績囉!並嘗試給定他的GPA囉!(Hint: 90分以上:A+ ; 80~89分:A ; 70~79分:B ; 60~69分:C ; 60分以下:F)
weight=[0.01,0.3,0.4,0.2,0.09]
score=[100,70,85,60,100]


上一篇
[Day19]Hey! lambda 你在搞什麼?
下一篇
[Day21]排序?index sort? lambda又有你的事了?
系列文
從0開始學習程式-Python32

尚未有邦友留言

立即登入留言