条件

2017-10-25 12 views
0

私は大まかに近いPythonでいくつかのコードを書いているの組み合わせに応じた行動を拡張し、次の条件

vals = [3, 4] 
constraints = [5, 10] 

def foo(val, constraint): 
    return val <= constraint 

def bar(x, y): 
    # do stuff such as: 
    print(x, y) 

def baz(val): 
    # transform val, such as by doing: 
    new_val = (val * 20 - 5) ** 2 
    return new_val 

bar(*vals) 
if foo(vals[0], constraints[0]): 
    bar(vals[0], baz(vals[1])) 
if foo(vals[1], constraints[1]): 
    bar(baz(vals[0]), vals[1]) 
if foo(vals[0], constraints[0]) and foo(vals[1], constraints[1]): 
    bar(baz(vals[0]), baz(vals[1])) 

私は、これは代数的な関係であることを認識し、それははるかにあるはずのように感じていますこれをコードで表現するためのより簡潔な方法です。

はのは、インデックス0にfooによって返さTrueAあり、そしてインデックス1にfooによって返さTrueBであることを言ってみましょう。 Aが真である場合に適用される動作はaであり、同様にBbである。その他の結果は_です。生成される値のセットは、次のようになります。

| _ | A | B | 
----------------------------- 
_ | x, y | x, y | x, y | 
    |  | ax, y | x, by | 
----------------------------- 
    | x, y | x, y | x, y | 
A | ax, y | ax, y | x, by | 
    |  |  | ax, by | 
----------------------------- 
    | x, y | x, y | x, y | 
B | x, by | ax, y | x, by | 
    |  | ax, by |  | 

彼らは後でmap PEDまたは反復することができるように、これらの値を生成するための簡潔な(好ましくは、一般的な)方法はありますか?

+0

ここでは、「bar」と「baz」とは何ですか? – James

+0

@James 'bar'は、表示されたコードに関連していない副作用を持つ関数です。 'baz'は加算、乗算、または型を保持する他の演算などの入力値の変換です。 – Aaron3468

答えて

0

確かに、「コードでこれを表現する簡潔な方法」が必要なときは、どういう意味なのか分かりません。これらの関数を一般化するには、次のようにします:

def foo(val, constraint): 
    return val <= constraint 

def bar(x, y): 
    print x, y 

def baz(val): 
    return (val * 20 - 5) ** 2 

def foobar(a, b) 
    if a <= b: 
     print a, b 

def barbaz(a, b, c) 
    if b <= c: 
     print baz(a), b 

def bazfoo(a, b, c, d) 
    if a <= b and c <= d: 
     print baz(a), baz(c) 

vals = [3, 4] 
constraints = [5, 10] 

bar(*vals) 

foobar(vals[0], constraints[0]) 
barbaz(vals[0], vals[1], constraints[1]) 
bazfoo(vals[0], constraints[0], vals[1], constraints[1]) 
+0

これは、この問題に対する非常に一般的な解決策であるかどうかはわかりません。 'foobar'、' barbaz'、 'bazfoo'を作るのに必要な明示的なコーディングの量は' if'ステートメントのリファクタリングの目的を打ち消します。単純化されたバージョンを考えてみましょう:if a:f1(); if b:f2(); aとb:f3() 'ならば。理論的には、if:f1();にリファクタリングすることができます。 elif b:f2(); anyif:f3() '私は、Pythonにこれを行うための組み込みの方法があるかどうか疑問に思っています( 'if'sがもっと長くなる可能性があるので) – Aaron3468

+0

@ Aaron2468私はその問題を理解しているとは思わない。 – alex