3

Python の課題で、次の 2 つの関数を作成する必要がありました。

move(board, move)
undomove(board, move)

関数と同じ名前の引数を持つことは、私には悪い習慣のように思えます。私はすでに教授に連絡して変更しましたが、好奇心moveから、 内から関数を呼び出しundomoveたり、 で再帰を使用したりすることは可能moveですか? これらの関数内でmove、引数を参照します。

(問題がある場合は Python 3)

4

3 に答える 3

3

(機能) を理解することはできますが、move追加の体操が必要になります。

def move(move):
    print(move,"inside move")

def undomove(move):
    print (move,"inside undomove")
    this_mod =__import__(__name__)
    this_mod.move(move)

if __name__ == '__main__':
    move(1)
    undomove(2)

ただし、一般的には、その関数で必要になる関数と同じ名前のローカル変数に名前を付けることは絶対に避けます。

スタイルに関する限り、関数を作成することdef move(move): ...は間違いなく少し奇妙であり、カジュアルな読者は再帰関数を記述しようとしていると思われるため、それは絶対に避けます。undomove(move)whenがモジュール スコープで既に関数として定義されていると書くmoveと少し奇妙になりますが、一見すると混乱を招く可能性があります (ローカル変数ですか? 関数ですか?)。 .

于 2012-09-20T19:26:13.360 に答える
2

ここにはいくつかのオプションがありますが、最も単純なもの (名前の変更move) を除外して、他にもいくつかあります。

まず、関数に別の名前を作成して、moveオーバーライドされたときにそれを使用できるようにすることができます。

def move(...):
   ...

move_ = move

def undomove(..., move):
   move_(...)

これは、Python の関数が他のオブジェクトと同様に機能するため、関数を変数に割り当てるだけで機能します。

別のオプションは、関数をクラスに配置することです。つまり、関数は名前空間にあります。つまり、メソッドに としてアクセスしself.move()、パラメーターに としてアクセスしますmove。とはいえ、割り当てで関数がトップレベルである必要がある場合、それはオプションではありません。

于 2012-09-20T19:22:59.917 に答える
2

内部(または他の関数)からmove呼び出すことで、関数に到達できます。あまりエレガントではありません...globals()['move']undomove

于 2012-09-20T19:24:53.177 に答える