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

python中的reduce內(nèi)建函數(shù)使用方法指南

 更新時間:2014年08月31日 09:22:44   投稿:hebedich  
python中的reduce內(nèi)建函數(shù)是一個二元操作函數(shù),他用來將一個數(shù)據(jù)集合(鏈表,元組等)中的所有數(shù)據(jù)進(jìn)行下列操作:用傳給reduce中的函數(shù) func()(必須是一個二元操作函數(shù))先對集合中的第1,2個數(shù)據(jù)進(jìn)行操作,得到的結(jié)果再與第三個數(shù)據(jù)用func()函數(shù)運(yùn)算,最后得到一個結(jié)果

官方解釋:

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:

意思就是說:將一個可迭代的對象應(yīng)用到一個帶有兩個參數(shù)的方法上,我們稱之為appFun,遍歷這個可迭代對象,將其中的元素依次作為appFun的參數(shù),但這個函數(shù)有兩個參數(shù),作為哪個參數(shù)呢?有這樣的規(guī)則,看一下下面reduce方法的實(shí)現(xiàn),有三個參數(shù),第一個參數(shù)就是上面說的appFun,第二個參數(shù)就是那個可迭代的對象,而第三個呢?當(dāng)調(diào)用reduce方法的時候給出了initializer這個參數(shù),那么第一次調(diào)用appFun的時候這個參數(shù)值就作為第一個參數(shù),而可迭代對象的元素依次作為appFun的第二個參數(shù);如果調(diào)用reduce的時候沒有給出initializer這個參數(shù),那么第一次調(diào)用appFun的時候,可迭代對象的第一個元素就作為appFun的第一個元素,而可迭代器的從第二個元素到最后依次作為appFun的第二個參數(shù),除第一次調(diào)用之外,appFun的第一個參數(shù)就是appFun的返回值了。例如reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]),計算1到5的和,因?yàn)闆]有給定initializer參數(shù),所以第一次調(diào)用x+y時,x=1,即列表的第一個元素,y=2,即列表的第二個元素,之后返回的1+2的結(jié)果作為第二次調(diào)用x+y中的x,即上一次的結(jié)果,y=2,即第二個元素,依次類推,知道得到1+2+3+4+5的結(jié)果。

這樣看來,其實(shí)下面的代碼定義是有一點(diǎn)問題,我們在程序中調(diào)用這段代碼reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]),得到的結(jié)果為16,而正確的結(jié)果為15,問題在于如果集合不是以0開始,那么按照如下代碼,第一次調(diào)用x=1,即第一個元素,y也是等于1,也是第一個元素,而正確的y應(yīng)該是2。所以真正的reduce方法應(yīng)該和下面的例子是有差別的。

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函數(shù)能做什么,什么情況下要用reduce呢,看下面的例子:

例如上面的例子,實(shí)現(xiàn)一個整形集合的累加。假設(shè)lst = [1,2,3,4,5],實(shí)現(xiàn)累加的方式有很多:

第一種:用sum函數(shù)。

sum(lst) 

 
第二種:循環(huán)方式。

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表示當(dāng)做參數(shù),因?yàn)闆]有提供reduce的第三個參數(shù),所以第一次執(zhí)行時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表示當(dāng)做參數(shù),因?yàn)橹付藃educe的第三個參數(shù)為0,所以第一次執(zhí)行時x=0,y=1,第二次x=0+1,y=2,即列表的第二個元素, 
假定指定reduce的第三個參數(shù)為100,那么第一次執(zhí)行x=100,y仍然是遍歷列表的元素,最后得到的結(jié)果為115 
 
 
 
#或者 
def add(x,y): 
  return x+y 
 
print reduce(add, lst) 
#與方式1相同,只不過把lambda表達(dá)式換成了自定義函數(shù) 
 
#或者 
def add(x,y): 
  return x+y 
 
print reduce(add, lst,0) 
#與方式2相同,只不過把lambda表達(dá)式換成了自定義函數(shù) 

 
再舉一個例子:有一個序列集合,例如[1,1,2,3,2,3,3,5,6,7,7,6,5,5,5],統(tǒng)計這個集合所有鍵的重復(fù)個數(shù),例如1出現(xiàn)了兩次,2出現(xiàn)了兩次等。大致的思路就是用字典存儲,元素就是字典的key,出現(xiàn)的次數(shù)就是字典的value。方法依然很多

第一種:for循環(huán)判斷

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,{})  
#提供第三個參數(shù),第一次,初始字典為空,作為statistics的第一個參數(shù),然后遍歷lst,作為第二個參數(shù),然后將返回的字典集合作為下一次的第一個參數(shù) 
 
或者 
d = {} 
d.extend(lst) 
print reduce(statistics,d) 
#不提供第三個參數(shù),但是要在保證集合的第一個元素是一個字典對象,作為statistics的第一個參數(shù),遍歷集合依次作為第二個參數(shù) 

通過上面的例子發(fā)現(xiàn),凡是要對一個集合進(jìn)行操作的,并且要有一個統(tǒng)計結(jié)果的,能夠用循環(huán)或者遞歸方式解決的問題,一般情況下都可以用reduce方式實(shí)現(xiàn)。

reduce函數(shù)真是“一位好同志啊”!

相關(guān)文章

  • Python實(shí)現(xiàn)文件只讀屬性的設(shè)置與取消

    Python實(shí)現(xiàn)文件只讀屬性的設(shè)置與取消

    這篇文章主要為大家詳細(xì)介紹了Python如何實(shí)現(xiàn)設(shè)置文件只讀與取消文件只讀的功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2023-07-07
  • 簡單快捷:NumPy入門教程的環(huán)境設(shè)置

    簡單快捷:NumPy入門教程的環(huán)境設(shè)置

    NumPy是Python語言的一個擴(kuò)展程序庫,支持高階大量的維度數(shù)組與矩陣運(yùn)算,此外也針對數(shù)組運(yùn)算提供大量的數(shù)學(xué)函數(shù)庫,本教程是為那些想了解NumPy的基礎(chǔ)知識和各種功能的人準(zhǔn)備的,它對算法開發(fā)人員特別有用,需要的朋友可以參考下
    2023-10-10
  • Django使用中間件解決前后端同源策略問題

    Django使用中間件解決前后端同源策略問題

    這篇文章主要介紹了Django使用中間件解決前后端同源策略問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-09-09
  • python3 使用Opencv打開USB攝像頭,配置1080P分辨率的操作

    python3 使用Opencv打開USB攝像頭,配置1080P分辨率的操作

    今天小編就為大家分享一篇python3 使用Opencv打開USB攝像頭,配置1080P分辨率的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • Python處理中文標(biāo)點(diǎn)符號大集合

    Python處理中文標(biāo)點(diǎn)符號大集合

    中文文本中可能出現(xiàn)的標(biāo)點(diǎn)符號來源比較復(fù)雜,通過匹配等手段對他們處理的時候需要格外小心,防止遺漏,下面小編給大家?guī)砹薖ython處理中文標(biāo)點(diǎn)符號大集合,感興趣的朋友跟隨腳本之家小編一起看看吧
    2018-05-05
  • Python全面解讀高級特性切片

    Python全面解讀高級特性切片

    這篇文章主要介紹了Python全面解讀高級特性切片,切片(slice)就是一種截取索引片段的技術(shù),借助切片技術(shù),我們可以十分靈活地處理序列類型的對象,下面我們一起進(jìn)入文章了解更詳細(xì)內(nèi)容吧
    2021-12-12
  • 聊聊python 邏輯運(yùn)算及奇怪的返回值(not,and,or)問題

    聊聊python 邏輯運(yùn)算及奇怪的返回值(not,and,or)問題

    在Python中,真值為假的對象,包括False,None,數(shù)字0,空字符串以及空的容器類型,除此以外的任何對象均為真,本文重點(diǎn)給大家介紹python 邏輯運(yùn)算及奇怪的返回值(not,and,or)問題,感興趣的朋友一起看看吧
    2022-03-03
  • 什么是Python中的匿名函數(shù)

    什么是Python中的匿名函數(shù)

    在本篇文章里小編給大家整理的是關(guān)于Python匿名函數(shù)知識點(diǎn)總結(jié),需要的朋友們可以學(xué)習(xí)參考下。
    2020-06-06
  • PyQt5顯示GIF圖片的方法

    PyQt5顯示GIF圖片的方法

    今天小編就為大家分享一篇PyQt5顯示GIF圖片的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-06-06
  • Python GUI編程之tkinter 關(guān)于 ttkbootstrap 的使用詳解

    Python GUI編程之tkinter 關(guān)于 ttkbootstrap 的使用

    ttkbootstrap 是一個基于 tkinter 的界面美化庫,使用這個工具可以開發(fā)出類似前端 bootstrap 風(fēng)格的 tkinter 桌面程序,這篇文章主要介紹了Python GUI編程之tkinter 關(guān)于 ttkbootstrap 的使用詳解,需要的朋友可以參考下
    2022-03-03

最新評論