欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

跟老齊學(xué)Python之大話題小函數(shù)(2)

 更新時間:2014年10月10日 09:10:00   投稿:hebedich  
上篇文章我們講訴了map 和lambda函數(shù)的使用,本文我們繼續(xù)來看看reduce和filter函數(shù),有需要的朋友可以參考下

上一講和本講的標(biāo)題是“大話題小函數(shù)”,所謂大話題,就是這些函數(shù)如果溯源,都會找到聽起來更高大上的東西。這種思維方式絕對我堅定地繼承了中華民族的優(yōu)良傳統(tǒng)的。自從天朝的臣民看到英國人開始踢足球,一直到現(xiàn)在所謂某國勃起了,都一直在試圖論證足球起源于該朝的前前前朝的某國時代,并且還搬出了那時候的一個叫做高俅的球星來論證,當(dāng)然了,勃起的某國是擋不住該國家隊在世界杯征程上的陽痿,只能用高俅來意淫一番了。這種思維方式,我是堅定地繼承,因為在我成長過程中,它一直被奉為優(yōu)良傳統(tǒng)。阿Q本來是姓趙的,和趙老爺是本家,比秀才要長三輩,雖然被趙老爺打了嘴。

廢話少說,書接前文,已經(jīng)研究了map,下面來看reduce。

忍不住還得來點廢話。不知道看官是不是聽說過MapReduc,如果沒有,那么Hadoop呢?如果還沒有,就google一下。下面是我從維基百科上抄下來的,共賞之。

復(fù)制代碼 代碼如下:

MapReduce是Google提出的一個軟件架構(gòu),用于大規(guī)模數(shù)據(jù)集(大于1TB)的并行運算。概念“Map(映射)”和“Reduce(化簡)”,及他們的主要思想,都是從函數(shù)式編程語言借來的,還有從矢量編程語言借來的特性。

不用管是不是看懂,總之又可以用開頭的思想意淫一下了,原來今天要鼓搗的這個reduce還跟大數(shù)據(jù)有關(guān)呀。不管怎么樣,你有夢一般的感覺就行。

reduce

回到現(xiàn)實,清醒一下,繼續(xù)敲代碼:

復(fù)制代碼 代碼如下:

>>> reduce(lambda x,y: x+y,[1,2,3,4,5])
15

 請看官仔細觀察,是否能夠看出是如何運算的呢?畫一個圖:

還記得map是怎么運算的嗎?忘了?看代碼:

復(fù)制代碼 代碼如下:

>>> list1 = [1,2,3,4,5,6,7,8,9]
>>> list2 = [9,8,7,6,5,4,3,2,1]
>>> map(lambda x,y: x+y, list1,list2)
[10, 10, 10, 10, 10, 10, 10, 10, 10]

 看官對比一下,就知道兩個的區(qū)別了。原來map是上下運算,reduce是橫著逐個元素進行運算。

權(quán)威的解釋來自官網(wǎng):

復(fù)制代碼 代碼如下:

reduce(function, iterable[, initializer])
 
Apply function of two arguments cumulatively to the items of iterable, from left to right, so as to reduce the iterable to a single value. For example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) calculates ((((1+2)+3)+4)+5). The left argument, x, is the accumulated value and the right argument, y, is the update value from the iterable. If the optional initializer is present, it is placed before the items of the iterable in the calculation, and serves as a default when the iterable is empty. If initializer is not given and iterable contains only one item, the first item is returned. Roughly equivalent to:

 

復(fù)制代碼 代碼如下:

 def reduce(function, iterable, initializer=None):
    it = iter(iterable)
    if initializer is None:
        try:
            initializer = next(it)
        except StopIteration:   
            raise TypeError('reduce() of empty sequence with no initial value')   
    accum_value = initializer                                                                  
    for x in it:
        accum_value = function(accum_value, x)   
    return accum_value

 如果用我們熟悉的for循環(huán)來做上面reduce的事情,可以這樣來做:

復(fù)制代碼 代碼如下:

>>> lst = range(1,6)
>>> lst
[1, 2, 3, 4, 5]
>>> r = 0
>>> for i in range(len(lst)):
...     r += lst[i]
...
>>> r
15

 for普世的,reduce是簡潔的。

為了鍛煉思維,看這么一個問題,有兩個list,a = [3,9,8,5,2],b=[1,4,9,2,6],計算:a[0]b[0]+a1b1+...的結(jié)果。

復(fù)制代碼 代碼如下:

>>> a
[3, 9, 8, 5, 2]
>>> b
[1, 4, 9, 2, 6]

>>> zip(a,b)        #復(fù)習(xí)一下zip,下面的方法中要用到
[(3, 1), (9, 4), (8, 9), (5, 2), (2, 6)]

>>> sum(x*y for x,y in zip(a,b))    #解析后直接求和
133

>>> new_list = [x*y for x,y in zip(a,b)]    #可以看做是上面方法的分布實施
>>> #這樣解析也可以:new_tuple = (x*y for x,y in zip(a,b))
>>> new_list
[3, 36, 72, 10, 12]
>>> sum(new_list)     #或者:sum(new_tuple)
133

>>> reduce(lambda sum,(x,y): sum+x*y,zip(a,b),0)    #這個方法是在耍酷呢嗎?
133

>>> from operator import add,mul            #耍酷的方法也不止一個
>>> reduce(add,map(mul,a,b))
133

>>> reduce(lambda x,y: x+y, map(lambda x,y: x*y, a,b))  #map,reduce,lambda都齊全了,更酷嗎?
133

 filter

filter的中文含義是“過濾器”,在python中,它就是起到了過濾器的作用。首先看官方說明:

復(fù)制代碼 代碼如下:

filter(function, iterable)

Construct a list from those elements of iterable for which function returns true. iterable may be either a sequence, a container which supports iteration, or an iterator. If iterable is a string or a tuple, the result also has that type; otherwise it is always a list. If function is None, the identity function is assumed, that is, all elements of iterable that are false are removed.

Note that filter(function, iterable) is equivalent to [item for item in iterable if function(item)] if function is not None and [item for item in iterable if item] if function is None.

這次真的不翻譯了(好像以往也沒有怎么翻譯呀),而且也不解釋要點了。請列位務(wù)必自己閱讀上面的文字,并且理解其含義。英語,無論怎么強調(diào)都是不過分的,哪怕是做乞丐,說兩句英語,沒準(zhǔn)還可以討到英鎊美元呢。

通過下面代碼體會:

復(fù)制代碼 代碼如下:

>>> numbers = range(-5,5)
>>> numbers
[-5, -4, -3, -2, -1, 0, 1, 2, 3, 4]

>>> filter(lambda x: x>0, numbers)
[1, 2, 3, 4]

>>> [x for x in numbers if x>0]     #與上面那句等效
[1, 2, 3, 4]

>>> filter(lambda c: c!='i', 'qiwsir')  #能不能對應(yīng)上面文檔說明那句話呢?
'qwsr'                                  #“If iterable is a string or a tuple, the result also has that type;”

 至此,用兩此介紹了幾個小函數(shù),這些函數(shù)在對程序的性能提高上,并沒有顯著或者穩(wěn)定預(yù)期,但是,在代碼的簡潔上,是有目共睹的。有時候是可以用來秀一秀,彰顯python的優(yōu)雅和自己??帷?br />

相關(guān)文章

  • python給視頻添加背景音樂并改變音量的具體方法

    python給視頻添加背景音樂并改變音量的具體方法

    在本篇文章里小編給大家整理的是關(guān)于python給視頻添加背景音樂并改變音量的具體方法,需要的朋友們可以參考下。
    2020-07-07
  • 在Python的Flask框架中使用日期和時間的教程

    在Python的Flask框架中使用日期和時間的教程

    這篇文章主要介紹了在Python的Flask框架中使用日期和時間的教程,包括對各個時區(qū)之間轉(zhuǎn)換的一些處理,需要的朋友可以參考下
    2015-04-04
  • python的字典和集合你了解嗎

    python的字典和集合你了解嗎

    章主要為大家詳細介紹了python的字典和集合,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • PyTorch 對應(yīng)點相乘、矩陣相乘實例

    PyTorch 對應(yīng)點相乘、矩陣相乘實例

    今天小編就為大家分享一篇PyTorch 對應(yīng)點相乘、矩陣相乘實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • linux下安裝python3和對應(yīng)的pip環(huán)境教程詳解

    linux下安裝python3和對應(yīng)的pip環(huán)境教程詳解

    這篇文章主要介紹了linux下安裝python3和對應(yīng)的pip環(huán)境,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-07-07
  • Python?Socket實現(xiàn)遠程木馬彈窗詳解

    Python?Socket實現(xiàn)遠程木馬彈窗詳解

    這篇文章主要介紹了Python?Socket實現(xiàn)遠程木馬彈窗詳解,Socket用來描述IP地址和端口,是通信鏈的句柄,應(yīng)用程序可以通過Socket向網(wǎng)絡(luò)發(fā)送請求或者應(yīng)答網(wǎng)絡(luò)請求
    2022-07-07
  • python調(diào)用攝像頭拍攝數(shù)據(jù)集

    python調(diào)用攝像頭拍攝數(shù)據(jù)集

    這篇文章主要為大家詳細介紹了Python調(diào)用攝像頭拍攝數(shù)據(jù)集,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • Python新手入門最容易犯的錯誤總結(jié)

    Python新手入門最容易犯的錯誤總結(jié)

    這篇文章主要總結(jié)了一些關(guān)于Python新手入門最容易犯的錯誤,希望通過學(xué)習(xí)本文總結(jié)的十二點易犯錯誤點,能夠給新手們帶來一定的幫助,需要的朋友可以參考學(xué)習(xí),下面來一起看看吧。
    2017-04-04
  • matplotlib實現(xiàn)熱成像圖colorbar和極坐標(biāo)圖的方法

    matplotlib實現(xiàn)熱成像圖colorbar和極坐標(biāo)圖的方法

    今天小編就為大家分享一篇matplotlib實現(xiàn)熱成像圖colorbar和極坐標(biāo)圖的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • Python中的進制轉(zhuǎn)換詳解

    Python中的進制轉(zhuǎn)換詳解

    這篇文章主要介紹了Python中的進制轉(zhuǎn)換詳解,python內(nèi)置函數(shù)進行進制轉(zhuǎn)換的原理是將讀入的一個字符串(python默認讀入的都是字符串形式)轉(zhuǎn)為10進制,然后再用相關(guān)函數(shù)進行其他進制轉(zhuǎn)換,需要的朋友可以參考下
    2023-08-08

最新評論