2013年2月28日 星期四

python 的 functools.partial 函數

很久以前,就看過這個  functools.partial 了。 只是一直不太明瞭它的實際作用。直到最近我在讀 c++11 時,看到 std::bind 時,我突然領悟 functools.partial 和 std::bind 做的事情一樣。



先來看c++11的簡單例子。

#include <functional>
#include <iostream>

using namespace std;
using namespace std::placeholders; 

int product(int a, int b){
    return a * b;
}

int main(){
    auto product_3 = std::bind(product, _1, 3);
    cout << product_3(5) << endl;
}

上面這個例子, product 就是一般的函數宣告。而第十二行所做的事情則是建立一個新函數,叫做 product_3。product_3 和 product 做的事情差不多,只是product_3 就是 固定傳 3 到 參數 b的 product function。 如果你想要傳固定值到參數 a 的話,只要把第十二行的 3 和 _1 互換即可。

看了複雜的 c++ ,我相信你應該會更喜歡 python 的語法。以下是 python 的例子。


def add(a, b):
    return a + b

import functools
add_two = functools.partial(add, b=2)

print add_two(5)

python 的例子就比 c++ 簡單多了。 從第五行很明顯看到 add_two function就是 把 b 的值固定成 2 的 add funcion。

註: 在 c++ 中,為了使用 _1 變數,必須有 using namespace std::placeholders; 。否則會出現變數未宣告的錯誤。

1 則留言: