Pythonに三項条件演算子がない場合、他の言語構造を使って三項条件演算子をシミュレートすることは可能ですか?
はい、バージョン2.5で[追加][1]されました。式の構文は
a if condition else b
まず condition
が評価され、次に condition
の [Boolean][4] 値に基づいて a
または b
のどちらか一方が評価されて返される。もし condition
が True
と評価された場合、a
が評価されて返されるが b
は無視される。
これにより、condition
が true の場合は a
のみが評価され、b
は全く評価されないが、condition
が false の場合は b
のみが評価され、a
は全く評価されないので、短絡することができる。
例えば
>>> 'true' if True else 'false'
'true'
>>> 'true' if False else 'false'
'false'
条件式は statement ではなく expression であることに注意してください。つまり、条件式の中では代入文やpass
などのステートメントを使用することはできません:
>>> pass if False else x = 3
File "<stdin>", line 1
pass if False else x = 3
^
SyntaxError: invalid syntax
しかし、条件式を使って次のように変数を代入することはできます:
x = a if True else b
条件式は2つの値を切り替えるものと考えてください。この条件式は、ある値か別の値か、というような場合に非常に便利ですが、それ以外にはあまり役に立ちません。
ステートメントを使用する必要がある場合は、条件式の代わりに通常の if
ステートメント** を使用する必要があります。
いくつかの理由で Pythonist から嫌われていることを覚えておいてください:
condition ? a : b
三項演算子とは異なるため、Python'の "surprising" 動作に慣れていない人が使うとバグにつながる可能性がある(引数の順序を逆にする可能性がある)。if
'は本当に便利で、スクリプトをより簡潔にすることができますが、本当にコードを複雑にします)もし順番を覚えるのが難しいのであれば、声に出して読むと、(ほとんど)自分の言いたいことが言えることを思い出してください。例えば、x = 4 if b > 8 else 9
は、x will be 4 if b is greater than 8 otherwise 9
と音読される。
公式ドキュメント
条件式][2
Cの"?: "三項演算子に相当するものはありますか][3]。
[1]: https://mail.python.org/pipermail/python-dev/2005-September/056846.html "[Python-Dev]条件式の解決"; [2]: https://docs.python.org/3/reference/expressions.html#conditional-expressions "条件式"; [3]: https://docs.python.org/3.3/faq/programming.html#is-there-an-equivalent-of-c-s-ternary-operator "Cの三項演算子"?: "に相当するものはありますか? [4]: https://en.wikipedia.org/wiki/Boolean_data_type "ブールデータ型";
タプルにインデックスを付けることができます:
(falseValue, trueValue)[test]
test
は_True_または_False_を返す必要があります。
常に次のように実装する方が安全かもしれません。
(falseValue, trueValue)[test == True]
または、組み込みの[bool()
][2]を使用して、[ブール][1]値を保証できます。
(falseValue, trueValue)[bool(<expression>)]
[1]:https://en.wikipedia.org/wiki/Boolean_data_type "Boolean data type"。 [2]:https://docs.python.org/3.3/library/functions.html#bool "bool"。
2.5より前のバージョンでは、そこにトリックがある:
[expression] and [on_true] or [on_false]
on_true`がfalseのブール値の場合、間違った結果を出すことがあります。 が偽のブール値を持つ場合、間違った結果を出すことがあります。1</sup>; これは式を左から右に評価するという利点があり、私の意見ではより明確です。
1. Cの三項演算子"?: "に相当するものはありますか</sub>;
<コード> < i>& lt; expression 1& gt;< > < b> if< / b> < i> < < < / i> <
a = 1。
b = 2。
>の場合1 bその他-1。
#出力は-1です。
>の場合1 b else -1 < b else 0。
#出力は-1です。
``。
ドキュメント]より:
条件式(「三項演算子」と呼ばれることもある)は、Pythonのすべての操作の中で最も優先順位が低い。 とあります; もし C が真なら、x が評価されてその値が返され、そうでなければ、y が評価されてその値が返されます。 を返します; 条件式の詳細については[PEP 308]を参照してください。
バージョン2.5からの新機能です。
[ドキュメント]: https://docs.python.org/3/reference/expressions.html#conditional-expressions "条件式"; [PEP 308]: https://www.python.org/dev/peps/pep-0308/ "PEP308--条件式";
Pythonの条件式演算子は、Python Enhancement Proposal 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]
別の(信頼性が低い)が、より簡単な方法は、「and」および「or」演算子を使用することです。
result = (a > b) and x or y
ただし、「x」が「False」の場合、これは機能しません。
考えられる回避策は、次のように「x」と「y」のリストまたはタプルを作成することです。
result = ((a > b) and [x] or [y])[0]
または:
result = ((a > b) and (x,) or (y,))[0]
辞書を使用している場合は、三元条件を使用する代わりに、get(key、default)
を利用できます。例:
shell = os.environ.get('SHELL', "/bin/sh")
出典:?:WikipediaのPython< / sup>。
残念ながら、
(falseValue, trueValue)[test]
ソリューションには短絡動作がありません。したがって、条件に関係なく、「falseValue」と「trueValue」の両方が評価されます。 これは、最適ではない、またはバギーである可能性があります(つまり、. trueValue
と falseValue
の両方がメソッドであり、副作用がある可能性があります)。
これに対する1つの解決策は、
(lambda: falseValue, lambda: trueValue)[test]()
(実行は勝者が知られるまで遅れます;))、しかしそれは呼び出し可能なオブジェクトと呼び出し不可能なオブジェクトの間の不一致を導入します。 また、プロパティを使用した場合でも解決しません。
そして、話は続きます-言及された3つのソリューションから選択することは、少なくとも ⁇ ython2.5(IMHOはもはや問題ではない)を使用し、「trueValue」を評価する傾向がない短絡機能を持つことの間のトレードオフです-false」エラー。
異なるプログラミング言語のターナリーオペレーター。
ここでは、いくつかのプログラミング言語間で「外部オペレーター」に重要な違いを示しようとしています。
- 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 の三元演算子。
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の3次演算子*。
a = 1 if True else 0
# 1
b = 1 if False else 0
# 0
Python 2.5以降の場合、特定の構文があります。
[on_true] if [cond] else [on_false]
古いPythonsでは、3項演算子は実装されていませんが、シミュレートすることは可能です。
cond and on_true or on_false
ただし、潜在的な問題があり、「cond」が「True」と評価され、「on_true」が「False」と評価されると、「on_true」の代わりに「on_false」が返されます。 この動作が必要な場合は、メソッドで問題ありません。それ以外の場合は、これを使用してください。
{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には三元条件演算子がありますか??
はい。 文法ファイルから:
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は他の3番目の式を期待しているので、以下は機能しません:
[expression1 if expression2 for element in iterable]
# ^-- need an else here
SyntaxError:invalid syntax
を発生させます。
したがって、上記は不完全なロジックです(おそらくユーザーは誤った状態でno-opを期待します)、または意図されているのはフィルターとしてexpression2を使用することです-以下は合法的なPythonであることに注意してください:
[expression1 for element in iterable if expression2]
expression2
はリスト理解のフィルターとして機能し、3項の条件付き演算子ではありません。
以下を書くのは少し辛いかもしれません。
expression1 if expression1 else expression2
expression1
は、上記の使用で2回評価する必要があります。 単にローカル変数である場合、冗長性を制限できます。 ただし、このユースケースの一般的でパフォーマンスの高いPythonicイディオムは、「or」のショートカット動作を使用することです。
expression1 or expression2
これはセマンティクスで同等です。 一部のスタイルガイドでは、明確にするためにこの使用を制限する場合があります。これは、構文にほとんど意味を詰め込まないことに注意してください。
あなたはこれを行うことができます:-。
[condition]および[expression_1]または[expression_2];
。例:-。
print(number%2および "odd"または "even")
。これは、数値が奇数の場合は「odd」、数値が偶数の場合は「偶数」と出力します。 ___。
注:- 0、なし、誤り、空虚、空ストリングは誤りと評価されます。 また、0以外のデータはTrueと評価されます。
これがどのように機能するかです。
0 and exp
0の「and」は常にゼロに評価され、式を評価する必要がないため、式expはまったく評価されません。 . これが、すべての言語でコンパイラ自体が機能する方法です。
に。
1 or exp
式expは、1の「または」が常に1になるため、まったく評価されません。 結果はとにかく1になるので、式expを評価する必要はありません。 . (コンパイラ最適化方法)。
しかし、場合。
True and exp1 or exp2
exp1がfalseでない場合、「True and exp1」はTrueになるため、2番目の式exp2は評価されません。 .
同様に。
False and exp1 or exp2
式exp1は0を書き込むことに相当し、0で「and」を実行するとそれ自体は0になるため、式exp1は評価されませんが、「or」が使用されるため、exp1の後では、「or」の後に式exp2を評価します。 .
__。
注:-「or」と「and」を使用したこの種の分岐は、式_1にFalse(または0またはNoneまたはemptylist []またはemptystring ''のTruth値がない場合にのみ使用できます。)expression_1がFalseになると、exp_1とexp_2の間に「or」が存在するため、expression_2が評価されます。
exp_1とexp_2の真理値に関係なく、すべてのケースで動作させたい場合は、次のようにします:-。
[condition]および([expression_1]または1)または[expression_2];
。3項の条件付き演算子は、マルチラインif-elseの代わりに1行で条件をテストするだけで、コードをコンパクトにします。
[on_true] if [expression] else [on_false]。
# 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
# 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
# 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
答えよりもヒント(hundrethの時間に明白なことを繰り返す必要はありません)ですが、私は時々、そのような構造のオネライナーショートカットとして使用します。
if conditionX:
print('yes')
else:
print('nah')
、 なる:
print('yes') if conditionX else print('nah')
一部(多く:)は非胸性(ルビーっぽい:)として ⁇ をひそめるかもしれませんが、個人的にはより自然だと思います-つまり. 通常の表現方法に加えて、大きなコードブロックでは視覚的に少し魅力的です。
C
から派生した多くのプログラミング言語には、通常、次の三元条件演算子の構文があります。
<condition> ? <expression1> : <expression2>
最初は、「Python」 B 進化 D ictator F または L ife(もちろん、Guido van Rossumを意味します)はそれを拒否しました(非Pythonicスタイルとして) )、「C」言語に慣れていない人にとっては理解するのが非常に難しいためです。 また、コロン記号
:
は、すでにPython
で多くの用途があります。 PEP 308 が承認された後、「Python」は最終的に独自のショートカット条件付き式を受け取りました(現在使用しているもの)。
<expression1> if <condition> else <expression2>
したがって、最初に状態を評価します。 True
を返す場合、 expression1 が評価されて結果が得られます。それ以外の場合は、 expression2 が評価されます。 遅延評価メカニズムにより、1つの式のみが実行されます。
次にいくつかの例を示します(条件は左から右に評価されます)。
pressure = 10
print('High' if pressure < 20 else 'Critical')
# Result is 'High'
3項演算子は直列にチェーンできます。
pressure = 5
print('Normal' if pressure < 10 else 'High' if pressure < 20 else 'Critical')
# Result is 'Normal'
以下は以前のものと同じです。
pressure = 5
if pressure < 20:
if pressure < 10:
print('Normal')
else:
print('High')
else:
print('Critical')
# Result is 'Normal'
これが役立つことを願っています。
はい、pythonには3項演算子があります。これは、同じを示す構文と例コードです:)。
#[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")
Pythonの条件付き式の代替手段の1つは次のとおりです。
{True:"yes", False:"no"}[boolean]
次の素敵な拡張機能があります。
{True:"yes", False:"no", None:"maybe"}[boolean_or_none]
最短の変更が残っています:
("no", "yes")[boolean]
ただし、次の「yes()」と「no()」の両方の評価を避けたい場合は、代替手段はありません。
yes() if [condition] else no()
すでに回答したように、はい、pythonに3項演算子があります。
<expression 1> if <condition> else <expression 2>
追加情報:
< expression 1>
が[ショートサーキットの評価][1]を使用できる条件の場合:
a =真。
b =誤り。
#これの代わりに:
x = a if a else b。
#ショートカーキットの評価を使用できます。
x = aまたはb。
``。
PS:もちろん、ショートカーキットの評価は三元演算子ではありませんが、短絡で十分な場合は、三元がしばしば使用されます。
[1]:https://en.wikipedia.org/wiki/Short-circuit_evaluation。