2016-03-18 3 views
1

私は、値に対して一連の操作を実行する関数operations()を持っています。私はまた、パラメータとして関数を渡すことによって、値に対して任意の操作を実行しています。私は操作が呼び出される位置も指定しています。これは出力に影響するためです。私は現在、以下のコードに示すように各位置でif文を使用していますが、これを行うためのより良いツールがありますか?この人為的な例では問題ありませんが、実際のコードではもっと多くのステップがあるので、多くのif文が終了します。一連のステップで関数を呼び出す位置を指定します。

def add1(val): 
    return val + 1 

def operations(value, position, func): 
    if position == 0: 
     value = func(value) 
    value *= 2 
    if position == 1: 
     value = func(value) 
    value += 2 
    if position == 2: 
     value = func(value) 
    value *= 3 
    if position == 3: 
     value = func(value) 

    return value 

operations(1, 0, add1) # returns 18 
operations(1, 1, add1) # returns 15 
operations(1, 2, add1) # returns 15 
+0

あなたは常にそれを結果的に実行しますか?もしそうなら発電機を利用することができます。 – mr0re1

+0

操作は論理的に位置にどのように関連していますか?つまり、 'value * = 2'は常に' position == 0 'の後にあるべきですか、' position == 1'の前にあるべきですか? –

+0

@germn一貫している限り、現時点ではそれほど重要ではありません。 – david12345

答えて

0

最終的な答えは、プログラムロジックの依存してもよいが、ここであなたが示したロジックに基づいてコードです:

import operator 

def operations(value, position, func): 
    actions = { 
     0: (operator.mul, 2), 
     1: (operator.add, 2), 
     2: (operator.mul, 3), 
     3: (operator.add, 0), 
    } 

    for i, action in actions.items(): 
     if position == i: 
      value = func(value) 
     operation, val2 = action 
     value = operation(value, val2) 
    return value 

あなたは辞書内のアクションに位置を保存し、ループ内でそれを使用するには。 operator module docも参照してください。

0

あなたはおそらくは、あなたがそう、彼らは任意に取得することができますで作業している機能のルックアップをしたいです。

funcmap = { 
    0: add1, 
    1: add2, 
    2: add3 
} 

キーで関数を参照して、実行時にそれを取得できるようになる:

value = funcmap[idx](value) 
別の関数の引数としての機能を渡す - コンセプトは、あなたがすでにやっていることとは異なるではありません
関連する問題