はPythonて複条件オペレーター?
-
23-08-2019 - |
質問
がPythonでなくて複条件オペレーターでシミュレーションが出来る一つを使用その他の言語を構築します?
解決
ことにしました 追加 バージョン2.5.表現の構文は:
a if condition else b
第 condition
を評価し、その後同一のいずれか a
または b
評価-返されるの Boolean 価値の condition
.の場合 condition
評価 True
, その a
評価-返されるもの b
は無視されますと、その時 b
評価-返されるもの a
は無視されます。
この短絡が condition
がtrueのみ a
評価 b
なにより評価してすべてが condition
がfalseの場合のみ b
評価 a
は評価しない。
例えば:
>>> '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
また、使用条件式が割り当ての変数はこのように:
x = a if True else b
思い通りの条件式として切り替える。そういうのが大好きなんですいつ価値または他の状況ではない。
の使用を希望する場合は、事前に書きを通常の if
決 の代わり条件 表現.
この延によPythonistasの理由による
- めの引数が異なるクラシック
condition ? a : b
ternaryオペレーターから多くの他の言語(C、C++、Perl、Ruby,Java,Javascript等)、 るバグが人を知らないPythonのは"驚き"行動で(逆に引数ています。 - 一部で"扱今後とも、これに反して、通常の流れを考え(思考の条件として効果).
- 様式的ます。あの"インライン
if
することができ 本当に 有し、スクリプトにより簡潔に、本当にそうな複雑なコード)
まったりを覚え、そして忘れることが読み上げ、どのように言うことができる。例えば、 x = 4 if b > 8 else 9
読み上げて x will be 4 if b is greater than 8 otherwise 9
.
公式ドキュメンテーション
他のヒント
あなたがすることができ組へのインデックスます:
(falseValue, trueValue)[test]
test
はのの真またはのFalseを返す必要があります。
(falseValue, trueValue)[test == True]
か、ビルトイン bool()
を使用することができますA> のtype"> href="https://en.wikipedia.org/wiki/Boolean_data_type" rel="noreferrer" title="Booleanデータます:
(falseValue, trueValue)[bool(<expression>)]
2.5より前のバージョンでは、トリックがあります:
[expression] and [on_true] or [on_false]
ときon_true
これは間違った結果を与えることができます
偽のブール値を持っている。 1
それは私の意見では明確である右、左に式を評価することの利点を持っているもののます。
<サブ> 1。 の同等はありますCさん「:?」?三項演算する サブ>
<expression 1> if <condition> else <expression 2>
a = 1
b = 2
1 if a > b else -1
# Output is -1
1 if a > b else -1 if a < b else 0
# Output is -1
ドキュメントするから:
条件式(しばしば「三項演算子」と呼ばれる)全てのPython操作の最も低い優先度を有している。
発現
条件付きExpressions"> PEP 308 に -x if C else y
は、最初の条件を評価し、 C (のないX );もし C trueで、 X の評価され、その値が返されます。そうでない場合は、 Y が評価され、その値が返されます。
オペレーターのための条件式にPythonのための一環として2006年 Pythonの強化を提案308.その形が異なるから普通
?:
オペレーターです:<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")
ソース: ?:PythonではWikipedia
残念ながら、
(falseValue, trueValue)[test]
ソリューションは、短絡動作はありません。これfalseValue
とtrueValue
の両方が条件に関係なく評価されます。これは次善あるいはバギー(すなわちtrueValue
とfalseValue
両方がメソッドであると副作用を有することができる)とすることができる。
これに対する一つの解決策は次のようになります。
(lambda: falseValue, lambda: trueValue)[test]()
)、それは呼び出し可能と非呼び出し可能オブジェクトとの間の矛盾を導入し、(勝者が知られるまで実行が遅延しました)。プロパティを使用する場合に加えて、ケースを解決しない。
それで話が行く - 3の間では、溶液が挙げ選択するとトレードオフ、短絡機能を有する少なくともЗython2.5(もう私見ではない問題)を使用し、「へtrueValue
-評価さ-になりやすいされていない間であります-false」エラーます。
の三項演算子異なるプログラミング言語での
ここで私はちょうどプログラミング言語のカップルの間ternary operator
におけるいくつかの重要な違いを示すようにしてみてください。
のJavaScriptで三項演算子の
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で三項演算子の
a = 1 if True else 0
# 1
b = 1 if False else 0
# 0
はPython 2.5との新しい固有の構文があります:
[on_true] if [cond] else [on_false]
は、古いニシキヘビでは三項演算子が実装されていませんが、それはそれをシミュレートすることが可能です。
cond and on_true or on_false
けれども、cond
はTrue
し評価しon_true
が、その後False
はなく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の三項条件演算子を持っていますか?
はい。
:文法ファイルするからtest: or_test ['if' or_test 'else' test] | lambdef
関心の一部は、次のとおりです。
or_test ['if' or_test 'else' test]
そこで、三条件付きオペレーションの形式のものである:
expression1 if expression2 else expression3
expression3
が遅延評価されるであろう(すなわち、expression2
がブールコンテキストで偽である場合にのみ評価されます)。 (それが悪いスタイルと考えかもしれませんが。)そしてので再帰的な定義で、あなたは無期限にそれらをチェーンすることができます。
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
を発生させています。
したがって、上記の論理の不完全な部分のいずれかである(おそらく、ユーザが偽の状態には、オペアンプを期待していない)、または何を意図してもよいことは、フィルタとして式2を使用することである - 以下が合法のPythonであることに注意:
[expression1 for element in iterable if expression2]
expression2
は、リストの内包のためのフィルタとして機能し、のないの三項条件演算子である。
より狭い場合の代替構文:
あなたはそれが多少痛みを伴う次のように記述するために見つけることができます:
expression1 if expression1 else expression2
expression1
は、上記の使用で二回に評価する必要があります。それは単にローカル変数である場合は、冗長性を制限することができます。しかし、このユースケースのための共通およびパフォーマンスのPython的イディオムはor
のshortcutting振る舞いを使用することです。
expression1 or expression2
意味論で同等です。いくつかのスタイル・ガイドが明瞭の理由で、この使用を制限することに注意してください - 。それは非常に少ない構文に意味の多くを詰めるん。
Pythonの三項演算子をシミュレーションます。
例
a, b, x, y = 1, 2, 'a greather than b', 'b greater than a'
result = (lambda:y, lambda:x)[a > b]()
出力:
'b greater than a'
を実行します。-
[condition] and [expression_1] or [expression_2] ;
例:-
print(number%2 and "odd" or "even")
この印刷"奇数"の場合は番号が奇数の"もの"の場合は番号です。
その結果、- Conditionが真のexp_1を行うexp_2が実行されます。
注:- 0,無し、Falseの場合、emptylist,emptyString評価としてFalseです。他のデータ以外は0に評価します。
この作品:
場合の条件条件"が"True"のその後、expression_1評価するのではないexpression_2.した場合"と"ものを0(ゼロ)には、結果は常にへfasle.このように以下の声明
0 and exp
現expな評価しているすべてのら"と"0は常に評価がゼロにする必要がない評価の表現です。これはどのようにコンパイラは、すべての言語である。
に
1 or exp
現expな評価している全て"または"1では常に1です。なに迷惑を評価する表現expその結果、ます1。(コンパイラの最適化方法
がの場合
True and exp1 or exp2
第二の表現exp2な評価されて True and exp1
たいていそうなるであろうがexp1なfalseです。
することになるため、同様に
False and exp1 or exp2
現exp1な評価されてFalseの場合と同等の書面に0とって"および"を0にする0そのものがexp1から"または"使用されている評価の表現exp2後"または".
注:- このような分岐を使用"または"と"が"の時のみ使用できるexpression_1ない真実の値がFalseの場合(または0またはNoneまたはemptylist[]またはemptystring''.) 場合があるのでexpression_1がFalseの場合、そのexpression_2評価されますので存在感"または"とexp_1とexp_2.
場合にだいたいそれを動作させるためにすべての場合の如何にかかわらずexp_1とexp_2真理値は、この:-
[condition] and ([expression_1] or 1) or [expression_2] ;
三項条件演算子は、単に複数行を置き換える一列に条件をテストすることができます。
構文:
[on_true]の場合、[式]他[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 - 三項演算子があれば、他のネストされたように書くことができ
# 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
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
答えよりも先端を(100分の時間のための明白なことを繰り返す必要はありません)が、私は時々このような構築物でonelinerのショートカットとしてそれを使用します。
if conditionX:
print('yes')
else:
print('nah')
、になります:
print('yes') if conditionX else print('nah')
一部(多くは:) unpythonic(でも、ルビーっぽい:)とそれに難色を示すかもしれないが、私は個人的にはもっと自然を見つける - つまり、あなたが正常にそれを表現、プラスもう少し視覚的に魅力の大きなブロックでだろうかコードます。
a if condition else b
あなたが困っ思い出しを持っている場合だけ、このピラミッドを覚えます:
condition
if else
a b
YES、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")
C
由来の多くのプログラミング言語は、通常三項条件演算子の次の構文を持っています:
<condition> ? <expression1> : <expression2>
まず、
Python
の B のenevolentの D のictatorの F または L はIFE(Iはグイド・ヴァンロッサムは、平均しますそれは言語をC
するために使用されていない人々のために理解することは非常に困難だから、もちろん)、()非Python的なスタイルとしてそれを拒否しました。また、コロン記号の:
をすでにPython
で多くの用途があります。後の PEP 308 を承認された、Python
が最終的に独自のショートカット条件式を(私たちが今使用しているもの)を受けます:
<expression1> if <condition> else <expression2>
だから、まずそれが条件を評価します。それはTrue
を返す場合、の式1のが、結果を出すために評価され、それ以外の場合はの式2のが評価されます。起因しての の遅延評価のの力学 - 。一つだけの式が実行されます。
ここでは、いくつかの例は、(条件は左から右に評価される)である
pressure = 10
print('High' if pressure < 20 else 'Critical')
# Result is 'High'
三項演算子は、直列に連鎖させることができます:
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の条件式次のようになります:
{True:"yes", False:"no"}[boolean]
次の素敵な拡張子を持つます:
{True:"yes", False:"no", None:"maybe"}[boolean_or_none]
最短代替が残ってます:
("no", "yes")[boolean]
しかし、あなたは以下でyes()
とno()
の両方の評価を避けたい場合は何の選択肢はありません。
yes() if [condition] else no()
変数が定義され、それはあなただけ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
のチェーンの複数の事業者にきちんとした方法:の
f = lambda x,y: 'greater' if x > y else 'less' if y > x else 'equal'
array = [(0,0),(0,1),(1,0),(1,1)]
for a in array:
x, y = a[0], a[1]
print(f(x,y))
# Output is:
# equal,
# less,
# greater,
# equal