官方解釋:
這樣看來,其實下面的**定義是有一點問題,我們在程式中呼叫這段**reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]),得到的結果為16,而正確的結果為15,問題在於如果集合不是以0開始,那麼按照如下**,第一次呼叫x=1,即第乙個元素,y也是等於1,也是第乙個元素,而正確的y應該是2。所以真正的reduce方法應該和下面的例子是有差別的。
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 iterable:
accum_value = function(accum_value, x)
return accum_value
那麼reduce函式能做什麼,什麼情況下要用reduce呢,看下面的例子:
例如上面的例子,實現乙個整形集合的累加。假設lst = [1,2,3,4,5],實現累加的方式有很多:
第一種:用sum函式。
sum(lst)
第二種:迴圈方式。
def customer_sum(lst):result = 0
for x in lst:
result+=x
return result
#或者def customer_sum(lst):
result = 0
while lst:
temp = lst.pop(0)
result+=temp
return result
if __name__=="__main__":
lst = [1,2,3,4,5]
print customer_sum(lst)
第三種:遞推求和
def add(lst,result):if lst:
temp = lst.pop(0)
temp+=result
return add(lst,temp)
else:
return result
if __name__=="__main__":
lst = [1,2,3,4,5]
print add(lst,0)
第四種:reduce方式
lst = [1,2,3,4,5]print reduce(lambda x,y:x+y,lst)
#這種方式用lambda表示當做引數,因為沒有提供reduce的第三個引數,所以第一次執行時x=1,y=2,第二次x=1+2,y=3,即列表的第三個元素
#或者lst = [1,2,3,4,5]
print reduce(lambda x,y:x+y,lst,0)
#這種方式用lambda表示當做引數,因為指定了reduce的第三個引數為0,所以第一次執行時x=0,y=1,第二次x=0+1,y=2,即列表的第二個元素,
假定指定reduce的第三個引數為100,那麼第一次執行x=100,y仍然是遍歷列表的元素,最後得到的結果為115
#或者def add(x,y):
return x+y
print reduce(add, lst)
#與方式1相同,只不過把lambda表示式換成了自定義函式
#或者def add(x,y):
return x+y
print reduce(add, lst,0)
#與方式2相同,只不過把lambda表示式換成了自定義函式
再舉乙個例子:有乙個序列集合,例如[1,1,2,3,2,3,3,5,6,7,7,6,5,5,5],統計這個集合所有鍵的重複個數,例如1出現了兩次,2出現了兩次等。大致的思路就是用字典儲存,元素就是字典的key,出現的次數就是字典的value。方法依然很多
第一種:for迴圈判斷
def statistics(lst):dic = {}
for k in lst:
if not k in dic:
dic[k] = 1
else:
dic[k] +=1
return dic
lst = [1,1,2,3,2,3,3,5,6,7,7,6,5,5,5]
print(statistics(lst))
第二種:比較取巧的,先把列表用set方式去重,然後用列表的count方法
def statistics2(lst):m = set(lst)
dic = {}
for x in m:
dic[x] = lst.count(x)
return dic
lst = [1,1,2,3,2,3,3,5,6,7,7,6,5,5,5]
print statistics2(lst)
第三種:用reduce方式
def statistics(dic,k):if not k in dic:
dic[k] = 1
else:
dic[k] +=1
return dic
lst = [1,1,2,3,2,3,3,5,6,7,7,6,5,5,5]
print reduce(statistics,lst,{})
#提供第三個引數,第一次,初始字典為空,作為statistics的第乙個引數,然後遍歷lst,作為第二個引數,然後將返回的字典集合作為下一次的第乙個引數
或者d = {}
d.extend(lst)
print reduce(statistics,d)
#不提供第三個引數,但是要在保證集合的第乙個元素是乙個字典物件,作為statistics的第乙個引數,遍歷集合依次作為第二個引數
通過上面的例子發現,凡是要對乙個集合進行操作的,並且要有乙個統計結果的,能夠用迴圈或者遞迴方式解決的問題,一般情況下都可以用reduce方式實現。
reduce函式真是「一位好同志啊」!
HTML,原來是它們
在學習完牛腩新聞發布系統之後,才發現自己每天瀏覽的網頁是怎麼來的。原來,看起來很高大上的網頁自己也可以做得有模有樣。接下來的學習,應該就是具體知識細節的學習了。html的知識很簡單,也很基礎。html,超文字標記語言,標準通用標記語言下的乙個應用。web網頁也是一種文件,html就是用於編寫這種文件...
for迴圈原來是這樣
for迴圈可以說是程式中最靈活,最常用,最重要的乙個迴圈用法,大家經常用到,但是你真正理解for迴圈的執行原理嗎?舉個例子 for i 0 i 8 i 對於這個語句執行結束的時候 i 是多少?經常用,卻沒怎麼注意,執行結束的時候 i 是8 下面說一下for迴圈語句的執行過程 for 表示式1 表示式...
大學原來是這麼美好
人的一生會失去很多東西,有的追逐一生也得不到,有的短暫的擁有卻最終失去!我們一生都在為這些得到與得不到而苦腦 徘徊。我的大學時光也就這樣在揮揮噁噁的荒度了!記得大二時曾看過一部 大學我被你上了 記得當時在圖書館偶然看到這本書的時候,還以為是講一段美妙的大學愛情故事呢,等近不急待的看完了整部 才發現原...