2017-11-22 9 views
3

関数の集合のどれが真を返すかによって値を返したい。複数の関数の結果に応じて値を返すPythonの方法

if a(): 
    return 'a' 
elif b(): 
    return 'b' 
else: 
    return 'c' 

このようにして、より平凡な方法がありますか?

+0

おそらく三元表現ですか? –

+1

'a()else( 'b'(else else 'c')の場合) ' –

+0

はい、それは動作します。ありがとう。 – Nijan

答えて

4

あなたは反復可能に機能のすべてを置くことができる場合は、次の変更だけの事はfunctions(および必要に応じて「デフォルト」の復帰であるよう

functions = [a, b] 
for func in functions: 
    if func(): 
     return func.__name__ 
return "c" 

これは、機能の多くに付属し、より理にかなっています値)。あなたが機能としてこれをしたい場合:

def return_truthy_function_name(*functions, default): 
    """Iterate over `*functions` until a function returns a truthy value, then return its name. 
    If none of the functions return a truthy value, return `default`. 
    """ 
    for function in functions: 
     if function(): 
      return function.__name__ 
    return default 
+2

注意: 'functions'はあなたの例で' set'なので、 'b'は' a'の前に評価することができます。それをリストにする。 –

+0

ヘッドアップありがとう、私はこれらの種類のもののために最近セットを使用することに慣れています:) –

+0

戻り値は関数呼び出しと一致しますか?そうでなくても、タプルのリストをいつでも作成できるので、あなたの答えはまだOKです。 4つの連鎖条件がある場合、あなたの答えはたくさんのコピー/ペーストを避けることができます。 –

2

それはより多くのニシキヘビだ場合、私は知りませんが、それは2つのネストされた三元表現使用して短いです:2つの以上の条件がある場合

return 'a' if a() else ('b' if b() else 'c') 

を、ネスティング三項式が曖昧になり、ループのアプローチがCoal_ answer(多分tuplesのリストを使用して関数呼び出しと戻り値の間に明白な関係がない場合にはより良い)が関連付けられます。

あなたが条件式を使用でき
+0

短い==もっとPythonicですか? – ZWiki

+0

私はその質問を開いたままにしておきます。 –

0

return 'a' if a() else 'b' if b() else 'c' 
+0

あなたは1分遅れで来ました;-) – trincot

+0

これはJean-FrançoisFabreとほぼ同じです'答えです。 –

+0

これはかっこを使用しないので、さらに短くなります。ゴルフをコードしましょう。 – ZWiki

0
d = {a: 'a() is true', 
    b: 'b() is true', 
    c: 'c() is true'} 

for func, answer in d.items(): 
    if func(): 
    return answer 
return 'nothing seems to be true' 
+2

再度:順序付けされた辞書にするか、評価の順序を予測できません。それらはOPの場合と同等ではありません。実際には、ランダムなルックアップ辞書機能を使用していないので、タプルのリストはさらに優れています。 –

0

を実際にあなたが求める何をすべきか最もニシキヘビと一般化の方法は、おそらく

next((f for f in [a,b] if f()), c).__name__ 

ある注呼び出し可能なことジェネレータが空の場合は、c(目的に応じて定義されています)がデフォルトとして使用されます。

+0

"、"の後に空白を削除して1文字を保存することができます。しかし、私にとっては、すべての機能を呼び出すことは非スターターです。 –

+1

答えのほとんどはDVです。おそらく、私の質問のメタ効果はリンクさえしませんでしたが、人々は私のプロフィールを訪問しました。私はいくつかのアップホーセットといくつかのアップダウンを持っていました... https://meta.stackoverflow.com/questions/359703/why-質問 - それほど多くのアップヴォート愛。あなたのアップデートは+1をたくさん追加するので、最初の解決策を完全に削除し、 '次のもの –

関連する問題