亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

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

系統(tǒng) 1806 0

上一講和本講的標(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

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

跟老齊學(xué)Python之大話題小函數(shù)(2)_第1張圖片

還記得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)雅和自己??帷?


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 亚洲第五色综合网 | 久久伦理| 亚洲精品国产精品乱码不97 | 欧美一级片免费 | 国产福利在线 | 亚洲综合色就色手机在线观看 | 天天摸夜夜摸夜夜狠狠摸 | 中文字幕在线观看 | 午夜香蕉网| 国产一区二区免费 | 99久久国产综合精品麻豆 | 一区视频在线播放 | 久久久久18 | 一级国产精品一级国产精品片 | 日本护士a做爰免费观看 | 欧美毛片又粗又长又大 | 免费人成年短视频在线观看网站 | 欧美一级片免费在线观看 | 欧美人猛交日本人xxx | 91国内在线视频 | 欧美中文在线 | 99er这里只有精品 | 国产午夜影院 | 精品日本久久久久久久久久 | 99久久做夜夜爱天天做精品 | 国产精品亚洲综合一区在线观看 | 国产成人精品男人的天堂网站 | 狠狠躁夜夜躁人人爽天天段 | 人人干天天操 | 综合欧美日韩一区二区三区 | 成人精品免费网站 | 成人免费黄色 | 欧美夜夜操 | 久久99热只有视精品6国产 | 一区二区三区四区国产 | a级无毛片| 久久综合久色欧美婷婷 | 91久久精品午夜一区二区 | 成人激情免费视频 | 国产精品第一 | 久久久久久久性 |