2012-12-25 6 views
60

私は以下のリンクを読みましたが、私の質問には答えません。
Does Python have a ternary conditional operator?
if-elif-elseステートメントを1行に入れる?

が1行に収まるようであれば、elifの - else文を書くの簡単な方法があります(質問は1つのラインにあれば-else文を凝縮についてですか)?例えば

if expression1: 
    statement1 
elif expression2: 
    statement2 
else: 
    statement3 

[UPDATE]

if i>100: 
    x=2 
elif i<100: 
    x=1 
else: 
    x=0 

私は上記の例は次のように書くことができれば、それはより簡潔なようになります感じます。

x=2 if i>100 elif i<100 1 else 0 [WRONG] 

答えて

91

いいえ、少なくとも(任意の文では)不可能ではありません。 1行にすべてを当てはめると、長さが80文字を超えないようにすることが義務づけられているPEP-8に違反する可能性が高くなります。

これはPythonのZenにも当てはまります。「可読性は数えます。 (全体を読むためにPythonプロンプトでimport thisと入力してください)。

あなただけの表現のためではなく、文のために、Pythonで三項の式を使用することができます。

>>> a = "Hello" if foo() else "Goodbye" 

編集:あなたの改訂の質問は今3つの文が同一であることを示している

割り当てられる値を除きます。その場合には、連鎖三項演算子は、作業を行いますが、私はまだそれが読みにくくだと思う:

>>> i=100 
>>> a = 1 if i<100 else 2 if i>100 else 0 
>>> a 
0 
>>> i=101 
>>> a = 1 if i<100 else 2 if i>100 else 0 
>>> a 
2 
>>> i=99 
>>> a = 1 if i<100 else 2 if i>100 else 0 
>>> a 
1 
+0

なぜ2番目の式は0を返しませんでしたか? _i_が100を超えています – AstralWolf

+1

@AstralWolf:はい、式に '2ならば100>を表します... –

+0

うん、もし100ならば0、それ以外は0としてくださいよろしくお願いします – AstralWolf

36

あなただけ異なるケースについて異なる表現が必要な場合、これはあなたのために働く可能性があります

expr1 if condition1 else expr2 if condition2 else expr 

例:

a = "neg" if b<0 else "pos" if b>0 else "zero" 
+1

'' pos "'は*ではありません*文ではなく、式です。 –

+0

@TimPietzckerありがとう、私はより正確になるように投稿を更新しました。 – Lycha

11

else文にif節をネストするだけです。しかし、それはそれをよりきれいに見せることはありません。

>>> x=5 
>>> x if x>0 else ("zero" if x==0 else "invalid value") 
5 
>>> x = 0 
>>> x if x>0 else ("zero" if x==0 else "invalid value") 
'zero' 
>>> x = -1 
>>> x if x>0 else ("zero" if x==0 else "invalid value") 
'invalid value' 
2

これはまた、表現の性質にもよります。 「しない」という他の答えに関する一般的なアドバイスは、一般的なステートメントやジェネリック式には有効です。

しかし、必要なのは、指定されたオプションの値に応じて別の関数を呼び出すような "dispacth"テーブルです。関数を置いて辞書の中で呼び出すことができます。以下のような

何か:

def save(): 
    ... 
def edit(): 
    ... 
options = {"save": save, "edit": edit, "remove": lambda : "Not Implemented"} 

option = get_input() 
result = options[option]() 

(その代わりに

if option=="save": 
    save() 
... 

1

人々は、すでに言及した三元表現。時には単純な条件付き代入を例として使用すると、数式を使用して条件付き代入を実行することができます。これはあなたのコードを非常に読みやすいものにすることはできませんが、かなり短い行でそれを取得します。あなたの例では、次のように記述できます。

x = 2*(i>100) | 1*(i<100) 

比較がTrueまたはFalseになり、そして数字を掛けるときは、その後1または0のいずれか一つになり+の代わりに使用することができます|途中で。

2

まあ、私は、数ヶ月前に同様の問題に出くわしました私はあなたが実際にgetメソッドのdictオブジェクトを利用することができることを実現しました。

x = {i>100: 2, i<100: 1}.get(True, 0) 
基本的に i>100

i<100は両方ともtrueにすることはできませんので、それらのいずれかである場合Trueあなたは(2または1)それらのどれもがTrueされていない場合、あなたは0を取得する値を取得します。

+0

haha​​ ...これは素敵な小さなハックです、私はそれが好きでした;) – akki

関連する問題