2017-12-15 9 views
2

私はa、b、またはcという3つの値のいずれかを返す関数を持っています。私はf()の戻り値に基づいて異なる文を実行する必要がありpython:if/elif文を使って値をパイプする

def f(): 
    return x # a, b, or c 

:A、B、またはCこれを行うための最善の方法は、私が知っていることは、次のとおりです。

v = f() 
if v == a: 
    # Do A 
elif v == b: 
    # Do B 
else: 
    # Do C 

なしこの新しい変数vを導入すると、f()の戻り値を評価する別の方法がありますか?
何かこれは、多分?

if f() == a: 
    # Do A 
elif _value_from_above == b: 
    # Do B 
else: 
    # Do C 
+2

となります。どうしてこのようにしたいのですか?一時変数を作成すると何が問題になりますか? – darthbith

+0

@darthbith私が作成する変数の量を最小限に抑えようとしています。私は個人的な好みの方が多いと思います。 – slybloty

答えて

3
何をしたいおそらく

ない、しかし、1つのオプションは、関数の辞書を使用することです:

def do_a(); 
    .. 
def do_b(); 
    .. 
def do_c(); 
    .. 

strategy = { 
    a: do_a, 
    b: do_b 
    c: do_c 
} 

strategy[f()]() 

しかし、辞書のエントリが、その場合には、見つからなかった場合には、通常、あなたは、いくつかのエラー処理をしたいと思いますとにかく別の変数になる可能性が高くなります。さらに、それぞれのケースを独自の関数に抽出する必要があります。

多分あまり関係、唯一の2例がある場合は、三項演算子を使用することができますおそらくあなたはすでにこれを知って、プラスあなたの質問は以上の2例があり、プラスの人々ドンの多くものの

do_a() if f() == a else do_b() 

をとにかく三元演算子のようにはなりません。

C#/ Java/C++などのswitch文、またはHaskell/OCaml/F#/ Scala/Erlangなどのパターンマッチング文を使用する言語を使用することができます。パターンマッチング文は次のようになります。

match f() with 
| a -> 
    // do something 
    // and maybe something else too 
| b -> 
    // do some other thing 
    // and yet some other thing 

しかし、Pythonではこのような機能はありません。

+0

if elseブロックは条件付きで**コード**を実行するように設計されています。三項演算子は条件付きで**値**に評価されるように設計されています。三項演算子に問題がある人は、それが 'else else'文のためであるため、ある文または他の文を実行するためにそれを使用するときにそれを嫌うと確信しています。 –

+0

@ TadhgMcDonald-Jensenあなたは、私が上でそれを使用した方法はひどいですが、価値を評価するために使用されても多くの人が問題を抱えているようです。理想的には、私は可能な限り多くの純粋な関数を使用することを好み、絶対に必要なときには何かを行う(状態を変更する) – junichiro

1

/elifとPythonにswitch文がない場合、これを行う方法はありません。一時変数が必要です。

a、b、およびcの正確な値が分かっている場合は、ディスパッチテーブルを使用することもできます。もう少し冗長ですが、可能なブランチがたくさんある場合、それはより速く、おそらくより簡単になります。

ディスパッチテーブルを作るために:

  • それに対応する機能
  • return DISPATCH_TABLE[f()]()
  • とそのコードのすべてを置き換えcは、各ブランチ
  • ための機能は、A、Bをマッピングした辞書を作成してください

hereの例があります。

1

あなただけ(さらに計算せずに)答えをマップしたい場合は、(純一郎の答えに類似)の単純なマッピング機能でそれを解決することができます:

import random 

def f(): 
    foo = ['a', 'b', 'c', 'd', 'e'] 
    return random.choice(foo) 

if __name__ == '__main__': 
    from_to = dict(a=2, b=1, c=3, d=4, e=5) 
    print(from_to.get(f(), None)) 

をする場合には、あなたがf()からの予期せぬ値を持っていますfrom_to.get(f(), None)は、デフォルトでNone

関連する問題