Pythonには3項演算子がありますか?


Answers

タプルにインデックスを付けることができます:

(falseValue, trueValue)[test]

testTrueまたはFalseを返す必要があります。
常に以下のように実装する方が安全かもしれません。

(falseValue, trueValue)[test == True]

または、組み込みのbool()を使用してBoolean値を保証することができます。

(falseValue, trueValue)[bool(<expression>)]
Question

Pythonに三項条件演算子がない場合、他の言語構造を使用してシミュレートすることは可能ですか?




はい。

>>> b = (True if 5 > 4 else False)
>>> print b
True



条件 else if 式2

>>> a = 1
>>> b = 2
>>> 1 if a > b else -1 
-1
>>> 1 if a > b else -1 if a < b else 0
-1



Python 2.5以降には特定の構文があります:

[on_true] if [cond] else [on_false]

古いPythonでは、三項演算子は実装されていませんが、それをシミュレートすることは可能です。

cond and on_true or on_false

on_truecondTrue評価され、 on_falseFalse評価された場合、 on_false代わりにon_trueが返されるという潜在的な問題があります。 この動作が必要な場合は、このメソッドはOKです。それ以外の場合は、次のようにします。

{True: on_true, False: on_false}[cond is True] # is True, not == True

次のようにラップすることができます。

def q(cond, on_true, on_false)
    return {True: on_true, False: on_false}[cond is True]

この方法で使用します。

q(cond, on_true, on_false)

これはすべてのPythonバージョンと互換性があります。




あなたはしばしば

cond and on_true or on_false

これはon_true == 0のときに問題になります

>>> x = 0
>>> print x == 0 and 0 or 1 
1
>>> x = 1
>>> print x == 0 and 0 or 1 
1

あなたは通常の三項演算子がこの結果を期待します

>>> x = 0
>>> print 0 if x == 0 else 1 
0
>>> x = 1
>>> print 0 if x == 0 else 1 
1



Pythonには3項演算子がありますか?

はい。 文法ファイルから:

test: or_test ['if' or_test 'else' test] | lambdef

興味のある部分は次のとおりです。

or_test ['if' or_test 'else' test]

したがって、三項条件付き演算は次の形式です。

expression1 if expression2 else expression3

expression3は遅延評価されます(つまり、ブール値コンテキストではexpression2がfalseの場合にのみ評価されます)。 再帰的な定義のため、あなたは無期限にチェーンすることができます(ただし、悪いスタイルと見なすこともできます)。

expression1 if expression2 else expression3 if expression4 else expression5 # and so on

使用上の注意:

すべてのif else必要があることに注意してください。 リストの解説とジェネレータの表現を学ぶ人は、これを学ぶのが難しいレッスンであると感じるかもしれません。Pythonはelseの3番目の式を期待しているので、

[expression1 if expression2 for element in iterable]
#                          ^-- need an else here

SyntaxError: invalid syntax 。 したがって、上記は不完全なロジック(おそらくユーザが誤った条件で何もしないことを期待している)か、または意図しているのはexpression2をフィルタとして使用することです - 以下が正当なPythonであることに注意してください:

[expression1 for element in iterable if expression2]

expression2は、リストの理解のためのフィルタとして機能し、3項条件演算子ではありません

より狭い場合の代替構文:

次のように書くのはやや苦痛かもしれません。

expression1 if expression1 else expression2

expression1は、上記の使用法で2回評価する必要があります。 単純にローカル変数であれば、冗長性を制限することができます。 しかし、このユースケースのための一般的で実践的なPythonicイディオムは、ショートカット動作を使用することです:

expression1 or expression2

これはセマンティクスで同等です。 いくつかのスタイルガイドは、明快さの理由からこの使用法を制限するかもしれないことに注意してください。




Pythonの条件式の演算子は、 Python拡張提案308の一部として2006年に追加されました。 その形式は一般的な?:演算子と異なり、

<expression1> if <condition> else <expression2>

これは以下と同等です:

if <condition>: <expression1> else: <expression2>

次に例を示します。

result = x if a > b else y

使用できる別の構文(2.5より前のバージョンとの互換性):

result = (lambda:y, lambda:x)[a > b]()

ここで、オペランドは遅延評価されます。

別の方法は、タプルを索引付けすることです(他のほとんどの言語の条件演算子とは一致しません)。

result = (y, x)[a > b]

または明示的に構成された辞書:

result = {True: x, False: y}[a > b]

別の(あまり信頼性の低い)、より簡単な方法はandorを使うことです:

result = (a > b) and x or y

xFalse場合、これは機能しません。

回避策として、次のようにxyリストまたはタプルを作成することが考えられます。

result = ((a > b) and [x] or [y])[0]

または:

result = ((a > b) and (x,) or (y,))[0]

辞書で作業している場合は、三項条件を使用する代わりに、 get(key, default)を利用することができget(key, default)たとえば、次のようになります。

shell = os.environ.get('SHELL', "/bin/sh")

ソース: ?:




In [1]: a = 1 if False else 0

In [2]: a
Out[2]: 0

In [3]: b = 1 if True else 0

In [4]: b
Out[4]: 1



答えよりもヒントが多いです(hundrethの時間を明白に繰り返す必要はありません)が、私は時々、そのような構造のonelinerのショートカットとして使います:

if conditionX:
    print('yes')
else:
    print('nah')

、なる:

print('yes') if conditionX else print('nah')

いくつかの(多くの:)は、それにはまともなものではありませんが、私は個人的にそれをより自然に感じることができます。つまり、通常どおりに表現する方法と、大規模なコードブロックで視覚的に魅力的です。




他の回答に記載されているように三項オプションがありますが、ブール値またはNone値をチェックする場合は "or"を使ってシミュレーションすることもできます:

>>> a = False
>>> b = 5
>>> a or b
5

>>> a = None
>>> a or b
5





Links