經常會看到有些代碼中使用 functools.partial 來包裝一個函數,之前沒有太了解它的用法,只是按照別人的代碼來寫,今天仔細看了一下它的用法,基本的用法還是很簡單的。
functools.partial 的基本使用
假設我們有一個函數, 返回傳入參數加1的結果

正常調用這個函數很簡單

會輸出4, 這個很簡單。
如果我們再根據 addOne 生成一個新的函數

這時也會輸出 4。
這個4是怎么來的?
首先我們通過 add = functools.partial(addOne, 3) 定義一個新的變量 add , 它相當於 addOne(3) 的結果,此時的變量add是一個函數,當執行add() 時,其實執行的是addOne(3),結果也是addOne(3) 的結果,這個add()函數返回的4也就是addOne(3)的結果,這個4就是這么來的。
復雜一點的例子
上面的addOne函數只有一個參數,我們多加一個參,讓其返回兩個參數的和

輸出結果:
print(sum(5, 6)) 這個輸出 11 沒有什么好說的, print(sumY(6)) 這個也輸出11,這個是怎么來的?
當使用 sumY = functools.partial(sum, 5) 定義sumY變量時,其實是將 sum(x, y) 函數中的x值固定為 5 ,所以當調用sumY(6) 的時候,其實是返回的是sum(5, 6) 的值,也就是說,sumY函數不用再傳入x參數,而是固定為5。
kwargs 類型的參數
當一個函數的參數為k,v的形式該怎么定義partial函數呢?

可以在定義 partial 函數時,將對應的參數定義好,如果上面的age=18, 則新生成的函數相當於 show(name="yyx", age=18)
注意,這里如果使用partial定義了函數的參數,那么再調用的時候,就不能再傳相應的參數了,如上面的已經在showP函數中定義了age=18了,在調用showP()時,只能傳name參數,即只能使用showP(“yangyanxing”), 不能再傳入一個age參數, showP(“yangyanxing”, 28), 如果再加上age參數,則會報錯。
functools.partial 有什么用?
從上面的使用來看,似乎使用functools.partial 也沒有什么用,只是固定了某個參數的值,使原來的調用少傳一個參數罷了,但是我們可能有某種函數場景,它的參數是也一個函數,比如回調函數。

我們定義一個test函數,它會先執行了自己的一些邏輯以后,會調用傳入的callback函數,如果我們想將show函數當成callback參數傳到test函數中,注意這里的callback函數是沒有參數的,那么我們怎么將name和age參數傳到show函數中呢?
我們可以改寫test()函數

這種可以解決回調函數是show的情況,但是如果回調函數是別的呢?fly(h), eat(), run(date), 等等, 這種函數的參數你無法預知,你也不知道調用方會怎么調用,所以這時就可以使用 functools.partial 來生成一個新的函數

這樣就可以在調用方自己來控制了函數的參數了。
上面的輸出結果為

此文轉載文,著作權歸作者所有,如有侵權聯系小編刪除!
原文地址:https://www.tuicool.com/articles/ymUjuqY
需要源代碼或者想了解更多的(點擊這里查看)