Pythonの「関数ポインタ」

980 ワード

実は、Pythonはポインタをよくカプセル化して、すべては“オブジェクト”で、すべてのオブジェクトはすべて“変数”がそれを指しています.この「変数」が「ポインタ」です.Javaと同様に、ランダムに移動したり、演算したりすることはできません.関数を含めるのも「オブジェクト」で、変数で指定します.関数のエントリアドレスです.
C++における関数エントリアドレスを指すポインタを関数ポインタと呼ぶ.だから、この名詞もPythonに借りました.
たとえば、STLのsortでソートされたコードセグメントを書きます.
int arr[10]={5,8,4,7,6,5,7,4,2,9};
std::sort(arr,arr+10);

デフォルトは昇順ソートです.特殊なソート基準が必要な場合は、3番目のパラメータを指定します.3番目のパラメータは関数ポインタです.sortの原則は、元のシーケンスにおけるbがaより前に、関数ポインタpf(a,b)が呼び出す関数の戻り値がtrueであると仮定したときに交換されることである.falseを返すと、sortが不安定なソートなどのソートアルゴリズムに関係するため、2つの数が等しい場合でも位置を交換する可能性があります.
降順ソートを書きます.比較関数cmpを書く必要があります
bool cmp(int a,int b)
{
    return a>b;//            
}

次に、関数名がエントリアドレスなので、次のように伝えます.
std::sort(a,a+10,cmp);

Pythonでも同様に,リストのソート関数Sort(list,cmp)があると仮定する.
では、cmpも「オブジェクト」であり、関数エントリアドレスに入力できます.呼び出し文は次のとおりです.
def cmp(a,b):return a>b
li=[5,8,4,7,6,5,7,4,2,9]
Sort(li,cmp)

関数ポインタの機能にも似ています.