条件式 - python 条件演算子




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

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


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

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


異なるプログラミング言語の三項演算子

ここでは、2つのプログラミング言語の間でternary operator重要な違いを示してみます。

Javascriptの3進演算子

var a = true ? 1 : 0;
# 1
var b = false ? 1 : 0;
# 0

Rubyの三項演算子

a = true ? 1 : 0
# 1
b = false ? 1 : 0
# 0

Scalaの3項演算子

val a = true ? 1 | 0
# 1
val b = false ? 1 | 0
# 0

Rプログラミングにおける三項演算子

a <- if (TRUE) 1 else 0
# 1
b <- if (FALSE) 1 else 0
# 0

Pythonの三項演算子

a = 1 if True else 0
# 1
b = 1 if False else 0
# 0

今、あなたはPython言語の美しさを見ることができます。 非常に読みやすく保守的です。


@アップ:

残念ながら、

(falseValue, trueValue)[test]

ソリューションには短絡動作がありません。 したがって、条件に関係なく、falseValueとtrueValueの両方が評価されます。 これは、最適でないかバグである可能性があります(つまり、trueValueとfalseValueの両方がメソッドであり、副作用があります)。

これに対する1つの解決策は

(lambda: falseValue, lambda: trueValue)[test]()

(勝者が分かるまで実行が遅れる;))、呼び出し可能オブジェクトと非呼び出し可能オブジェクトの間に不一致が生じる。 また、プロパティを使用している場合は解決されません。

そして、話が進む - 3つの解決策の中から選択することは、少なくともpython 2.5(IMHOではもう問題ありません)を使用し、「trueValue-to-false」になりがちな短絡機能のトレードオフです。エラー。


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バージョンと互換性があります。


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")

ソース: ?:


ドキュメントから:

条件式(「3項演算子」とも呼ばれます)は、すべてのPython演算の優先度が最も低くなっています。

x if C else y最初に条件Cnot x )を評価する場合である。 Cがtrueの場合、 xが評価され、その値が返されます。 それ以外の場合は、 yが評価され、その値が返されます。

条件式の詳細については、 PEP 308を参照してください。

バージョン2.5以降の新機能


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

[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] ;


あなたはしばしば

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

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

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

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


はい、バージョン2.5でaddedaddedた。
構文は次のとおりです。

a if condition else b

最初のconditionが評価された後、 condition Boolean値に基づいてbまたはbが返されcondition
conditionTrueと評価された場合はaが返され、そうでない場合はbが返されます。

例えば:

>>> 'true' if True else 'false'
'true'
>>> 'true' if False else 'false'
'false'

条件であり、 ではないことに注意してください 。 これは、条件付きで、代入文やpass文などの文を使用できないことを意味します。

>>> pass if False else x = 3
  File "<stdin>", line 1
    pass if False else x = 3
          ^
SyntaxError: invalid syntax

このような場合は、条件文の代わりに通常のif文を使用する必要があります。

いくつかのPythonistasによっていくつかの理由でそれに悩まされていることに留意してください:

  • 引数の順序は、他の多くの言語(C、Ruby、Javaなど)とは異なり、Pythonの「驚くべき」動作に慣れていない人がそれを使用する(順序が逆になることがある)場合にバグにつながる可能性があります。
  • それは思考の通常の流れ(条件を最初に考え、次に効果を考える)に反するので、「扱いにくい」と感じる人もいます。
  • 文体的な理由。

注文を覚えていない場合は、大声でそれを読むと、あなたは(ほとんど)あなたが意味することを覚えておいてください。 たとえば、 x = 4 if b > 8 else 9x = 4 if b > 8 else 9x will be 4 if b is greater than 8 otherwise 9x = 4 if b > 8 else 9が読み上げられます。

公式文書:


はい:

あるブール値が真で、同じように変数xにある値を与えたいとしましょう

何か他のものがあればX = 5 x = 10

X = [ある値] [これが真の場合最初の値が評価される] else [他の値が評価される]


もちろん、理解するのは非常に簡単です。

general syntax : first_expression if bool_expression_is_true else second_expression

Example: x= 3 if 3 > 2 else 4 
# assigns 3 to x if the boolean expression evaluates to true or 4 if it is false

三項条件演算子は、単一行で条件をテストするだけで、複数行のif-elseを置き換えて、コードをコンパクトにすることができます。

構文:

[on_true] if [expression] else [on_false]

1-簡単な三項演算子を使用する方法:

# Program to demonstrate conditional operator
a, b = 10, 20
# Copy value of a in min if a < b else copy b
min = a if a < b else b
print(min)  # Output: 10

2-タプル、ディクショナリ、ラムダの直接使用法:

# Python program to demonstrate ternary operator
a, b = 10, 20
# Use tuple for selecting an item
print( (b, a) [a < b] )
# Use Dictionary for selecting an item
print({True: a, False: b} [a < b])
# lamda is more efficient than above two methods
# because in lambda  we are assure that
# only one expression will be evaluated unlike in
# tuple and Dictionary
print((lambda: b, lambda: a)[a < b]()) # in output you should see three 10

3項演算子はネストされたif-elseとして書くことができます:

# Python program to demonstrate nested ternary operator
a, b = 10, 20
print ("Both a and b are equal" if a == b else "a is greater than b"
        if a > b else "b is greater than a")

上記のアプローチは以下のように書くことができます:

# Python program to demonstrate nested ternary operator
a, b = 10, 20
if a != b:
    if a > b:
        print("a is greater than b")
    else:
        print("b is greater than a")
else:
    print("Both a and b are equal") 
# Output: b is greater than a

変数が定義されていて、値があるかどうかをチェックしたい場合は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

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

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

、なる:

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

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


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






python-2.5