2017-11-10 12 views
0

私は関数f(a、b)を書いています。構造は次のとおりです。Pythonで関数のマップを使う際の助けが必要

def f(a, b): 
    global result 

    def g(a, b): 
     global result 
     return result 

    deg h(a): 
     return a # an updated a 

    g(a, b) 
    a = h(a) 
    g(a, b) 
    a = h(a) 
    g(a, b) 
    a = h(a) 
    g(a, b) 
    return result 
  • あなたは私は2つのサブ機能g(a, b)f(a, b)h(a)を持っていることがわかります。
  • 私は結果を更新するために、もう一度g(a, b)を実行できるように、そして、私はa
  • を更新
  • 部分的な結果を得るためにg(a, b)を実行する必要があります。
  • g(a, b)の4回の実行の後、私は結果の完全な部分を得て、値を返します。

ここでは、プロセスをよりシンプルに見えるように構成する方法が必要です。

私も試してみました:

g(a, b) 
g(h(a), b) 
g(h(h(a), b) 
g(h(h(h(a), b) 

そして、それは同様に恐ろしい見えます。

map()やその他の高次関数を使用することを提案する必要がありますか?しかし、私はそれを理解できませんでした。

ありがとうございます!

+0

'map'は高次関数とは関係ありません。 – alfasin

+0

'グローバル結果 'の目的は何ですか?なぜ 'g'関数が返す値を保存していないのですか?そしてなぜあなたはそれを渡す引数で 'g'が何もしないのですか? –

+0

グローバル変数の代わりに関数の戻り値を使うことを考えましたか?その後、単純なforループで4回実行します。 –

答えて

1

何をやりたいと、そのようなものである場合:

g(a, b) 
a = h(a) 
g(a, b) 
a = h(a) 
g(a, b) 
a = h(a) 
g(a, b) 

あなたが行うことができます。

for i in range(4): 
    g(a, b) 
    a = h(a) 
g(a, b) 

もう少しコンパクト

+0

範囲は文ではありません。括弧が必要です。 –

2

まず第一に、あなたが引数と戻り値を使用する必要があります、副作用(グローバル変数を返すか変更する)ではありません。私はglobal resultの使用はあなたのコードが読めなくなりますことを見つけるが、私はあなたがこのように表現することができる動的な関数合成、について尋ねていると思う:

def compose(*fv): 
    return reduce(lambda f, g: lambda x: f(g(x)), fv) 

そして、このように使用(評価順序が正しいことに注意してください-to-左、共通である):

def add1(x): return x + 1 
def mul2(x): return x * 2 

>>> compose(add1, add1, add1)(1) 
4 
>>> compose(mul2, add1, add1, add1)(1) 
8 

これは関数型言語では一般的ですが、私はあなたがpythonでこのパターンをしたいとき、あなたは十分に物事をシンプル行っていないことがわかります。

関連する問題