0

可能であれば、Pythonでラムダ関数を使用して関数をn回呼び出す方法を教えてもらえますか?

私には機能があるように

def repeat_lam(a, n):
    lambda x: f(x)

aに、n回実行したいですx。現在のコードを編集してこれを行う方法がわかりません。

したがって、2 で乗算するように定義された関数がある場合、 と呼ばれmul_2ます。

repeat_lam(mul_2,3)(10)
80
4

4 に答える 4

4

したがって、私たちの仕様は次のとおりです。

>>> repeat_lam(mul_2,3)(10)
80

このセットアップでmul_2は、必要に応じて を使用して定義できる関数が必要lambdaです。それを示しますが、実際には必要ありません。willの実装はrepeat_lam、ラムダとは何の関係もありません。ただし、関数である必要があります...関数を返す(結果を(10).

def repeat_lam(func, times):
    def wrapper(arg):
        for i in range(times):
            arg = func(arg)
        return arg
    return wrapper

内部にネストされた関数を定義しますrepeat_lam。Python では、関数はオブジェクトであるため、他のオブジェクトと同様に扱うことができます。つまり、とりわけ、それを返すことができるということです :) ここで何が起こるかとwrapperいうと、に渡されたfuncとの値を参照するということです。これをサポートするために、Pythonは呼び出されるたびに個別のオブジェクトを返します。それぞれが関数になり、それぞれが "named"になりますが、内部の Python マジック (技術用語では、Python はクロージャを作成します)。timesrepeat_lamrepeat_lamwrapperfunctimes

したがって、返された関数を呼び出すと、呼び出し時に渡されたと が呼び出されたときに渡されたfuncとのtimes値が自動的に使用されます。コードの残りの部分は簡単です。 に繰り返し適用し、 に代入して結果を構築し、それを返します。repeat_lamargfuncargarg

そして今、それをテストすることができます (そして、ラムダがどのように使われているかを見ることができます):

>>> mul_2 = lambda x: x * 2
>>> repeat_lam(mul_2,3)(10)
80

ラムダの効果は次と同じです。

>>> def mul_2(x):
...     return x * 2

ただし、ラムダは単一の式しか評価できないため、本格的な関数よりもスコープが制限されます。それらの主な目的は、タスクが非常に単純で、わざわざ名前を付けたくない場合です。

>>> repeat_lam(lambda x: x * 2, 3)(10)
80
于 2012-09-03T11:35:47.310 に答える
3

シンプルで直接的なアプローチ:

def exec_num_times(f,times,*args,**kwargs):
  for _ in range(times):
      f(*args,**kwargs)

他の方法もあります。たとえば、関数と引数のリストがある場合:

results = [f(x) for x in list_of_args]

ただし、単純に;list_of_argsに直接渡すことができるため、これは必須ではありません。f()Python メソッドは引数の変数リストを使用するため、通常、メソッドに特定のの変数が渡されることに依存するべきではありません。あらゆるタイプで動作するのに十分な柔軟性が必要です。

于 2012-09-03T09:04:40.813 に答える
0

次のようなラムダ関数を定義できます。

ntimes = lambda f, args, n: (f(*args), ntimes(f, args, n-1)) if n>1 else (f(*args),)

def foo(bar):
    print "foo", bar
ntimes(foo, ["bar"], 10)

この場合、戻り値は個々の呼び出しの戻り値のタプルになります。

最初の呼び出しの戻り値を 2 番目の呼び出しなどに送りたい場合は、次のようなラムダ関数を使用します。

ntimes2 = lambda f, arg, n: ntimes2(f, f(arg), n-1) if n>1 else f(arg)

ただし、関数を n 回適用する最も簡単な方法は、ラムダ関数を使用するのではなく、for ループを使用することです。

于 2012-09-03T08:47:22.353 に答える
0

質問の性質上、「ループ」を完全に回避する関数型プログラミングで使用される手法を適応させ、それらを関数呼び出しに置き換えようとしている可能性があります。

したがって、経験的言語のように単純な言語構造に依存してステートメントを何度も繰り返すのではなく、次のようになります。

repeats = 10
result = 0
for i in range(repeats):
    result = function(result)

これの代わりに、2 つのパラメーターを受け取る関数を作成できます。2 番目はカウンターで、最初は中間結果です。カウンター値が 0 の場合は、単に中間結果を返します。それ以外の場合は、中間結果を使用して元の関数を呼び出し、自分自身を再度呼び出しますが、カウンターが 1 減ります。

def repeat_func(function, result, repeat):
    if repeat == 0:
        return result
    return repeat_func(function, function(result), repeat - 1)

プログラミングを学ぶ初期の頃、このアプローチを好む人もいましたが、明らかにより複雑です。あなたが研究しなければならない資料が何であれ、このようなことを示唆している場合は、研究する別の情報源を見つけることが重要です.

于 2012-09-03T11:11:56.673 に答える