-1

以下の c コードを Python で動作させたいのですが、どうすれば作れますか?

// low level
typedef int* (*func)(int);

// high level
int a[2];

// high level
int* foo(int i) { return &a[i]; }

// low level
void goo(func f) {
  int i = 0;
  for(; i < 2; ++i) *f(i) = 7;
}

int main(void)
{
  goo(foo);
  return 0;
}

goo などの低レベル関数を作成する場合、高レベルのユーザー定義関数 foo によって返されるポインターを使用したいと考えています。

c だとすごく簡単で、Python で作りたいのですが、どうすればいいですか? ありがとう!!

4

3 に答える 3

1

他の人たちと同じように、なぜあなたがこれを欲しがるのか、私には本当にわかりません。ただし、何かを変更する関数を返すことはできます。

コードの翻訳は次のとおりです。

# high level
a [ 0, 0 ]

# high level
def foo(i):
    def change(n): a[i] = n
    return change

# low level
def goo(f):
   for i in range(2):
        f(i)(7)

goo(foo)
于 2013-09-12T04:52:15.557 に答える
0

Python にはポインタも配列もありません。別の場所で作成されたリストに入力するのではなく、通常の Python のイディオムは、リストの変更されたコピーを返すことです。

ただし、Python では独自のオブジェクト タイプを定義し、演算子の意味をオーバーロードできます。したがって、Python でオーバーロードする単項 * はありませんが、p[x] が意味するものをオーバーロードでき、p[0] は C の *p と同じことを意味します。

Python クラスで何ができるかについては、こちらをお読みください。「新しいスタイル」のクラスは、Python 2.x では最良の選択であり、Python 3 では唯一の選択肢に なります。 http://docs.python.org/2/reference/datamodel.html

関数を Python 関数に渡す場合は、括弧なしで名前を渡すだけです。

import math
def f1(x):
    return 2*x + 1

def sumf( func, vals ):
    return sum( func(x) for x in vals );

print sumf( f1, (1, 2, 3) )
print sumf( math.cos, [0, math.pi/2, math.pi] )

ご覧のとおり、ライブラリ関数はユーザー定義関数と同じように渡されます。

于 2013-09-12T04:16:15.090 に答える