operators if 一行 - Pythonには3項演算子がありますか?



11 Answers

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

(falseValue, trueValue)[test]

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

(falseValue, trueValue)[test == True]

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

(falseValue, trueValue)[bool(<expression>)]
条件式 ワン ライナー

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




条件 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の条件式の演算子は、 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")

ソース: ?:




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

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




あなたはこれを行うことができます :-

[condition] and [expression_1] or [expression_2] ;

例: -

print(number%2 and "odd" or "even")

数字が奇数の場合は「奇数」、偶数の場合は「偶数」が表示されます。

結果: -条件が真の場合、exp_1が実行され、それ以外の場合はexp_2が実行されます。

注: - 0、None、False、emptylist、emptyStringはFalseと評価されます。 また、0以外のデータはTrueと評価されます。

それはどのように動作するのです:

条件[条件]が "真"になると、式1は評価されますが式2は評価されません。 "0"の何かを "and"した場合、結果は常に以下のステートメントの中でfasle .Soになります。

0 and exp

式expは全く評価されません。なぜなら、 "and"が0の場合は常にゼロと評価され、式を評価する必要はないからです。 これは、コンパイラ自体がすべての言語で動作する方法です。

1 or exp

式expは全く評価されません。なぜなら、 "1"をつけた "or"は常に1になるからです。だから結果は1になるので式expを評価するのは面倒ではありません。 (コンパイラの最適化方法)。

しかし、

True and exp1 or exp2

2番目の式exp2は評価されません。これは、exp1がfalseでないときにTrue and exp1がTrueになるためです。

同様に

False and exp1 or exp2

式exp1は評価されません。なぜなら、Falseは0を書いたときと同じで、0を指定すると0を返しますが、 "or"が使用されてからexp1の後に "or"の後にexp2を評価します。

注意: - "or"と "and"を使用したこの種の分岐は、expression_1の真偽値がFalse(または0またはNoneまたはemptylist []またはemptystring '')でない場合にのみ使用できます。 Falseの場合、exp_1とexp_2の間に "or"があるため、式2が評価されます。

exp_1とexp_2の真偽値が何であるかにかかわらず、すべてのケースでそれを有効にしたい場合は、次のようにします。

[condition] and ([expression_1] or 1) or [expression_2] ;




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



はい、あなたはそうすることができます:

is_fat = True
state = "fat" if is_fat else "not fat"

三項条件演算子の詳細を読む




はい、pythonは三項演算子を持っています、ここでは同じコードを示すための構文とサンプルコードです:)

#[On true] if [expression] else[On false]
# if the expression evaluates to true then it will pass On true otherwise On false


a= input("Enter the First Number ")
b= input("Enter the Second Number ")

print("A is Bigger") if a>b else print("B is Bigger")



変数が定義されていて、値があるかどうかをチェックしたい場合はa or b

def test(myvar=None):
    # shorter than: print myvar if myvar else "no Input"
    print myvar or "no Input"

test()
test([])
test(False)
test('hello')
test(['Hello'])
test(True)

出力する

no Input
no Input
no Input
hello
['Hello']
True



Related