摘要:上一講和本講的標(biāo)題是大話(huà)題小函數(shù),所謂大話(huà)題,就是這些函數(shù)如果溯源,都會(huì)找到聽(tīng)起來(lái)更高大上的東西。是提出的一個(gè)軟件架構(gòu),用于大規(guī)模數(shù)據(jù)集大于的并行運(yùn)算。
上一講和本講的標(biāo)題是“大話(huà)題小函數(shù)”,所謂大話(huà)題,就是這些函數(shù)如果溯源,都會(huì)找到聽(tīng)起來(lái)更高大上的東西。這種思維方式絕對(duì)我堅(jiān)定地繼承了中華民族的優(yōu)良傳統(tǒng)的。自從天朝的臣民看到英國(guó)人開(kāi)始踢足球,一直到現(xiàn)在所謂某國(guó)勃起了,都一直在試圖論證足球起源于該朝的前前前朝的某國(guó)時(shí)代,并且還搬出了那時(shí)候的一個(gè)叫做高俅的球星來(lái)論證,當(dāng)然了,勃起的某國(guó)是擋不住該國(guó)家隊(duì)在世界杯征程上的陽(yáng)痿,只能用高俅來(lái)意淫一番了。這種思維方式,我是堅(jiān)定地繼承,因?yàn)樵谖页砷L(zhǎng)過(guò)程中,它一直被奉為優(yōu)良傳統(tǒng)。阿Q本來(lái)是姓趙的,和趙老爺是本家,比秀才要長(zhǎng)三輩,雖然被趙老爺打了嘴。
廢話(huà)少說(shuō),書(shū)接前文,已經(jīng)研究了map,下面來(lái)看reduce。
忍不住還得來(lái)點(diǎn)廢話(huà)。不知道看官是不是聽(tīng)說(shuō)過(guò)MapReduc,如果沒(méi)有,那么Hadoop呢?如果還沒(méi)有,就google一下。下面是我從維基百科上抄下來(lái)的,共賞之。
MapReduce是Google提出的一個(gè)軟件架構(gòu),用于大規(guī)模數(shù)據(jù)集(大于1TB)的并行運(yùn)算。概念“Map(映射)”和“Reduce(化簡(jiǎn))”,及他們的主要思想,都是從函數(shù)式編程語(yǔ)言借來(lái)的,還有從矢量編程語(yǔ)言借來(lái)的特性。
不用管是不是看懂,總之又可以用開(kāi)頭的思想意淫一下了,原來(lái)今天要鼓搗的這個(gè)reduce還跟大數(shù)據(jù)有關(guān)呀。不管怎么樣,你有夢(mèng)一般的感覺(jué)就行。
reduce回到現(xiàn)實(shí),清醒一下,繼續(xù)敲代碼:
>>> reduce(lambda x,y: x+y,[1,2,3,4,5]) 15
請(qǐng)看官仔細(xì)觀察,是否能夠看出是如何運(yùn)算的呢?畫(huà)一個(gè)圖:
還記得map是怎么運(yùn)算的嗎?忘了?看代碼:
>>> 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]
看官對(duì)比一下,就知道兩個(gè)的區(qū)別了。原來(lái)map是上下運(yùn)算,reduce是橫著逐個(gè)元素進(jìn)行運(yùn)算。
權(quán)威的解釋來(lái)自官網(wǎng):
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:
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)來(lái)做上面reduce的事情,可以這樣來(lái)做:
>>> 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是簡(jiǎn)潔的。
為了鍛煉思維,看這么一個(gè)問(wèn)題,有兩個(gè)list,a = [3,9,8,5,2],b=[1,4,9,2,6],計(jì)算:a[0]b[0]+a1b1+...的結(jié)果。
>>> 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)] #可以看做是上面方法的分布實(shí)施 >>> #這樣解析也可以: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) #這個(gè)方法是在??崮貑幔?133 >>> from operator import add,mul #??岬姆椒ㄒ膊恢挂粋€(gè) >>> reduce(add,map(mul,a,b)) 133 >>> reduce(lambda x,y: x+y, map(lambda x,y: x*y, a,b)) #map,reduce,lambda都齊全了,更酷嗎? 133filter
filter的中文含義是“過(guò)濾器”,在python中,它就是起到了過(guò)濾器的作用。首先看官方說(shuō)明:
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.
這次真的不翻譯了(好像以往也沒(méi)有怎么翻譯呀),而且也不解釋要點(diǎn)了。請(qǐng)列位務(wù)必自己閱讀上面的文字,并且理解其含義。英語(yǔ),無(wú)論怎么強(qiáng)調(diào)都是不過(guò)分的,哪怕是做乞丐,說(shuō)兩句英語(yǔ),沒(méi)準(zhǔn)還可以討到英鎊美元呢。
通過(guò)下面代碼體會(huì):
>>> 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") #能不能對(duì)應(yīng)上面文檔說(shuō)明那句話(huà)呢? "qwsr" #“If iterable is a string or a tuple, the result also has that type;”
至此,用兩此介紹了幾個(gè)小函數(shù),這些函數(shù)在對(duì)程序的性能提高上,并沒(méi)有顯著或者穩(wěn)定預(yù)期,但是,在代碼的簡(jiǎn)潔上,是有目共睹的。有時(shí)候是可以用來(lái)秀一秀,彰顯python的優(yōu)雅和自己??帷?/p>
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/37386.html
摘要:開(kāi)篇就要提到一個(gè)大的話(huà)題編程范型。例如,在面向?qū)ο缶幊讨?,程序員認(rèn)為程序是一系列相互作用的對(duì)象,而在函數(shù)式編程中一個(gè)程序會(huì)被看作是一個(gè)無(wú)狀態(tài)的函數(shù)計(jì)算的串行。 開(kāi)篇就要提到一個(gè)大的話(huà)題:編程范型。什么是編程范型?引用維基百科中的解釋?zhuān)? 編程范型或編程范式(英語(yǔ):Programming paradigm),(范即模范之意,范式即模式、方法),是一類(lèi)典型的編程風(fēng)格,是指從事軟件工程...
摘要:字符串是一個(gè)很長(zhǎng)的話(huà)題,縱然現(xiàn)在開(kāi)始第三部分,但是也不能完全說(shuō)盡。字符串就是一個(gè)話(huà)題中心。也就是和是指向同一個(gè)字符。字符串截取有了編號(hào),不僅僅能夠找出某個(gè)字符,還能在字符串中取出一部分來(lái)。 字符串是一個(gè)很長(zhǎng)的話(huà)題,縱然現(xiàn)在開(kāi)始第三部分,但是也不能完全說(shuō)盡。因?yàn)樽址亲匀徽Z(yǔ)言中最復(fù)雜的東西,也是承載功能最多的,計(jì)算機(jī)高級(jí)語(yǔ)言編程,要解決自然語(yǔ)言中的問(wèn)題,讓自然語(yǔ)言中完成的事情在計(jì)算機(jī)上...
摘要:要研究清楚一些函數(shù)特別是內(nèi)置函數(shù)的功能,建議看官首先要明白內(nèi)置函數(shù)名稱(chēng)的含義。前面提到的內(nèi)置函數(shù)得到的結(jié)果,就是一個(gè)排好序的。至此,有關(guān)的基本操作的內(nèi)置函數(shù),就差不多了。 list的話(huà)題的確不少,而且,在編程中,用途也非常多。 有看官可能要問(wèn)了,如果要生成一個(gè)list,除了要把元素一個(gè)一個(gè)寫(xiě)上之外,有沒(méi)有能夠讓計(jì)算機(jī)自己按照某個(gè)規(guī)律生成list的方法呢? 如果你提出了這個(gè)問(wèn)題,充分...
摘要:補(bǔ)充一個(gè)資料,供有興趣的朋友閱讀浮點(diǎn)數(shù)算法爭(zhēng)議和限制說(shuō)明以上除法規(guī)則,是針對(duì),在中,將和等同起來(lái)了。比如下面的例子不啰嗦了,實(shí)驗(yàn)一個(gè)注意了,引用了一個(gè)模塊之后,再做除法,就不管什么情況,都是得到浮點(diǎn)數(shù)的結(jié)果了。 除法啰嗦的,不僅是python。 整數(shù)除以整數(shù) 看官請(qǐng)?jiān)趩?dòng)idle之后,練習(xí)下面的運(yùn)算: >>> 2/5 0 >>> 2.0/5 0.4 >>> 2/5.0 0.4 >...
摘要:函數(shù)的基本結(jié)構(gòu)中的函數(shù)基本結(jié)構(gòu)函數(shù)名參數(shù)列表語(yǔ)句幾點(diǎn)說(shuō)明函數(shù)名的命名規(guī)則要符合中的命名要求。在中,將這種依賴(lài)關(guān)系,稱(chēng)之為多態(tài)。不要期待在原處修改的函數(shù)會(huì)返回結(jié)果比如一定要之用括號(hào)調(diào)用函數(shù)不要在導(dǎo)入和重載中使用擴(kuò)展名或路徑。 在本教程的開(kāi)始部分,就已經(jīng)引入了函數(shù)的概念:《永遠(yuǎn)強(qiáng)大的函數(shù)》,之所以那時(shí)候就提到函數(shù),是因?yàn)槲矣X(jué)得函數(shù)之重要,遠(yuǎn)遠(yuǎn)超過(guò)一般。這里,重回函數(shù),一是復(fù)習(xí),二是要在已經(jīng)...
閱讀 2671·2021-11-15 11:38
閱讀 2984·2021-11-02 14:44
閱讀 3937·2021-09-26 10:13
閱讀 3171·2021-08-13 15:02
閱讀 856·2019-08-30 15:56
閱讀 1634·2019-08-30 15:53
閱讀 2407·2019-08-30 13:01
閱讀 3298·2019-08-29 12:57