博客 / 詳情

返回

Python代碼閲讀(第45篇):柯里化

Python 代碼閲讀合集介紹:為什麼不推薦Python初學者直接看項目源碼

本篇閲讀的代碼實現了將函數柯里化的功能。

在計算機科學中,柯里化(英語:Currying),又譯為卡瑞化或加里化,是把接受多個參數的函數變換成接受一個單一參數(最初函數的第一個參數)的函數,並且返回接受餘下的參數而且返回結果的新函數的技術。

本篇閲讀的代碼片段來自於30-seconds-of-python。

curry

from functools import partial

def curry(fn, *args):
  return partial(fn,*args)

# EXAMPLES
add = lambda x, y: x + y
add10 = curry(add, 10)

add10(20) # 30

curry函數接收一個接受多個參數的初始函數和部分參數,返回接受單一參數的函數。

函數使用functools.partial()生成一個部分對象。該部分對象被調用時的行為類似於fn給定了部分參數被調用,需要提供剩餘參數。

在直覺上,柯里化聲稱“如果你固定某些參數,你將得到接受餘下參數的一個函數”。所以對於有兩個變量的函數x+y,如果固定了y=2,則得到有一個變量的函數x+2

functools.partial(func, /, *args, **keywords)
返回一個新的 部分對象,當被調用時其行為類似於 func 附帶位置參數args和關鍵字參數keywords被調用。 如果為調用提供了更多的參數,它們會被附加到args。 如果提供了額外的關鍵字參數,它們會擴展並重載keywords。 大致等價於:

def partial(func, /, *args, **keywords):
  def newfunc(*fargs, **fkeywords):
    newkeywords = {**keywords, **fkeywords}
    return func(*args, *fargs, **newkeywords)
  newfunc.func = func
  newfunc.args = args
  newfunc.keywords = keywords
  return newfunc
user avatar u_16213589 頭像 xiaoweiyu 頭像 juqipeng 頭像 u_16213335 頭像 wangyaxi 頭像 zilliz 頭像 qutianhang 頭像
7 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.