2017-06-29 9 views
4

私は2つの引数を渡されたTHSの機能があります。Python - elif:return()文が多すぎますか?

def function(a, b): 
    if a == 'd' : return(4*b) 
    elif a == '!' : return(5) 
    elif a == 'k' : return(1-2*k+k**2) 
    elif a == 'Z' : return(1/k) 
    (...) 

aは、単一の文字にそれの平等をチェックしている、とbは常に数です。関数は常に数値も返します。時にはそれはいつも簡単な帰りではない。

def function(a, b): 
    (...) 
    elif a == '2': 
     temp_b = foo(b) 
     if b == 2 : temp_b += 2 
     return(temp_b) 

私はELIF文の非常に長いリストを持って、これを行うには良い方法はありますか?

+1

ええ、それを複数の機能に変換してください。 'def all_funcs(operation、operand)'はpythonicではありません – TemporalWolf

答えて

8

実際にはいです。まず最初に、Pythonには象徴的なswitchステートメントがありません。このステートメントは、ステートメントが長くなり、リニア検索よりもはるかに速い場合にバイナリ検索を行います。 (これはOを持って

def call(a, x): 
    return functions[a](x) 

def other_case(x): 
    '''We can store non-lambdas too''' 

    return 8 

functions = { 
    'd': lambda x: 4*x, 
    '!': lambda x: 5, 
    'k': lambda x: (1-2*x+x**2), 
    'Z': lambda x: (1/x), 
    '*': other_case, 
} 

はちょうど短いラッパー、これを呼び出すために:

Pythonでは、あなたは正確な値、またはカスタム関数のいずれかで、辞書を使用することができます1)時間、または複雑さが一定であるため、読み易くなるだけでなく、時間も大幅に短縮されます。

編集

あなたはすべてのその全範囲を超えることができ、特定の範囲の数字を持っている場合は、リストや変換を使用することができます。私は100 Daの間隔で、2000 Daの質量から5000 Daまで(私は生物学者です)何かを処理したいとします。 500項目のリストをエンコードするのは意味がありませんが、30項目のリストを使用して範囲全体を検討できます。

from __future__ import division   # for //, floor division 

def mass2000(x): 
    '''Do something for mass of 2000''' 

    return 1/x 

def mass2100(x): 
    '''Do something for mass of 2100''' 

    return x 

def mass2200(x): 
    '''Do something for mass of 2200''' 

    return x**2 


lookup = [ 
    mass2000, 
    mass2100, 
    mass2200, 
    # .... 
] 


def call(mass, x): 
    if (mass < 2000 or mass > 5000): 
     raise ValueError("Mass out of range") 

    return lookup[(mass - 2000) // 100](x) 
+1

私は関数ディクショナリが道に行くと思っていました。今までにそのように実装する方法を手がかりにしたことはありませんでした! – Graviton

+0

'a'が異なるタイプであるとします。 intsの場合は、dictではなくリストを使用できます。 'a'が浮動小数点だったら? – saintsfan342000

+1

@ saintsfan342000実際にはフロア分割を使用できます。私は実際にこれを前にしなければならなかった。私は私の答えを編集します。 –

1

キーが値として相関関数/ラムダ関数を持つ文字であることに辞書を持って、その後、個々のミニ関数やラムダ関数にあなたの例すべてを分離することが有益である可能性があります。

ここでは例です:

def function_2(b): 
    temp_b = foo(b) 
    if b == 2 : temp_b += 2 
    return(temp_b) 

fp = { 
    2 : function_2 
} 

その後、あなたは辞書をループし、キーと一致し、一度あなたがこのようにBを渡すことができます一致するループを持つことができます。

for element in fp: 
    if element == a: 
     fp[element](b) 
関連する問題