2016-11-03 4 views
0

次のコードをより効率的な方法でPythonで実行するにはどうすればよいですか?入力フラグはバイナリ値です。出力は、フラグのすべての可能な順列に依存する。複数の条件を有効に

def f1(): 

    return 1 

def f2(): 

    return 2 

def f3(): 

    return 3  


def g(p1, p2, p3): 

    if p1 == 1 & p2 == 0 & p3 == 0: 
     f1() 

    elif: p1 == 0 & p2 == 1 & p3 == 0: 
     f2() 

    elif: p1 == 0 & p2 == 0 & p3 == 1: 
     f3() 

    elif: p1 == 1 & p2 == 1 & p3 == 1: 
     f1() 
     f2() 

など。

+0

'P1 == 1&P2 == 1&p3の場合== 1 '' f3() 'を実行したくないのですか? – BorrajaX

+2

*など*?あなたがここに示していることから、望ましい行動が明らかであるようには思われません。 – Psidom

+0

はい、あります。申し訳ありません、それはタイプミスでした。 –

答えて

1

あたりのよう

def f1(): 
    return 1 

def f2(): 
    return 2 

def f3(): 
    return 3 

def g(*ps): 
    functions = [f1, f2, f3] 
    for i, p in enumerate(ps): 
     if p == 1: # Could do just `if p:` (0 evaluates to False, anything else to True) 
      print(functions[i])() # Notice the() to actually call the function 

if __name__ == "__main__": 
    print("Run 1 0 0") 
    g(1, 0, 0) 
    print("Run 1 1 0") 
    g(1, 1, 0) 
    print("Run 0 1 0") 
    g(0, 1, 0) 
    print("Run 1 1 1") 
    g(1, 1, 1) 

*argsを使用して(thisthisthisを参照)、リストにあなたの機能を入れて(うん、Pythonはあなたがそれを行うことができます)など何かを得るリストのcommentをこの回答に追加すると、コードをもう少し短くすることもできます。例えば、zipを使用して:

def g(*ps): 
    functions = [f1, f2, f3] 
    for function, p in zip(functions, ps): 
     if p: 
      print(function()) 

またはitertools.compressを使用して(あなたは、ファイルの先頭にimport itertoolsする必要があります):

def g(*ps): 
    functions = [f1, f2, f3] 
    for function in itertools.compress(functions, ps): 
     print(function()) 
+2

'for func、p in zip(functions、ps):'と '' indexing 'を避けるために '' enumerate'を使うのはなぜですか?その点については、itertools.compress(functions、ps):func() 'のfuncのために' itertools'を使ってさらに簡単にすることができます。 '' compress''は、 p))。 – ShadowRanger

+0

非常に真実!実際、私は 'itertools.compress'を知りませんでした!! (TIL)**: - )**私はzipについて考えていました...私は最初のコードからできるだけ逸脱しようとしていましたか?しかし、あなたは正しい:OPはより効率的な方法を求め、それはそうである。 – BorrajaX

+1

私はあなたの答えの1つを見つけて、それをアップアップしよう! **: - D ** – BorrajaX

3

あなたは、単一の番号に3ビットをまとめると、次のようにその数の値をテストすることができます:あなたはフラグとして引数を(p1, p2, p3)使用したい場合、あなたはいつものように、これらの引数を詰めることができ

def g(p1, p2, p3): 

    v = (p1 << 2) + (p2 << 1) + p3 

    if v == 4: # 100 
     f1() 
    elif v == 2: # 010 
     f2() 
    elif v == 1: # 001 
     f3() 
    elif v == 7: # 111 
     f1() 
     f2() 
+1

私は個人的に '0b100' /' 0b010'/etcを使います。それを少し明白にするための定数として、しかし、ええ、私はちょうど15秒後にこの正確な答えを投稿(そして削除)しました。 – ShadowRanger