Python Language
条件式
サーチ…
前書き
if、elif、elseなどのキーワードを含む条件式は、ブール条件に応じて異なるアクションを実行する機能をPythonプログラムに提供します(TrueまたはFalse)。このセクションでは、Pythonの条件文、ブール論理、および三項文の使用について説明します。
構文
- <式> if <条件付き> else <式>#三項演算子
if、elif、else
Pythonでは、あなたは使用して条件文のシリーズを定義することができるif
最初の1、のためelif
アップまでの残りのため、最終的に(オプション) else
、他の条件文で捕捉されないもののために。
number = 5
if number > 2:
print("Number is bigger than 2.")
elif number < 2: # Optional clause (you can have multiple elifs)
print("Number is smaller than 2.")
else: # Optional clause (you can only have one else)
print("Number is 2.")
出力Number is bigger than 2
elif
代わりにelse if
を使用すると構文エラーが発生し、許可されません。
条件式(または「三項演算子」)
三項演算子は、インライン条件式に使用されます。簡単に読み取れるシンプルで簡潔な操作に最適です。
- 引数の順序は、他の多くの言語(C、Ruby、Javaなど)とは異なり、Pythonの「驚くべき」動作に慣れていない人がそれを使用する(順序が逆になることがある)場合にバグにつながる可能性があります。
- それは思考の通常の流れ(条件を最初に考え、次に効果を考える)に反するので、「扱いにくい」と感じる人もいます。
n = 5
"Greater than 2" if n > 2 else "Smaller than or equal to 2"
# Out: 'Greater than 2'
この式の結果は、英語で読み込まれた結果になります。条件式がTrueの場合は、左側の式に、それ以外の場合は右側に評価されます。
テナント操作は、次のようにネストすることもできます。
n = 5
"Hello" if n > 10 else "Goodbye" if n > 5 else "Good day"
if文
if condition:
body
if
ステートメントは条件をチェックします。 True
と評価されると、 if
文の本体が実行されTrue
。 False
と評価された場合は、本文をスキップします。
if True:
print "It is true!"
>> It is true!
if False:
print "This won't get printed.."
条件には任意の有効な式を使用できます。
if 2 + 2 == 4:
print "I know math!"
>> I know math!
Elseステートメント
if condition:
body
else:
body
前の条件文がすべてFalseに評価された場合に限り、else文はその本体を実行します。
if True:
print "It is true!"
else:
print "This won't get printed.."
# Output: It is true!
if False:
print "This won't get printed.."
else:
print "It is false!"
# Output: It is false!
ブール論理式
ブール論理式は、に評価することに加えて、 True
またはFalse
、と解釈された値を返すTrue
またはFalse
。 if-elseテストが必要なロジックを表現するのはPythonの方法です。
そしてオペレータ
and
演算子はすべての式を評価し、すべての式がTrue
評価された場合は最後の式を返します。それ以外の場合は、 False
と評価される最初の値を返します。
>>> 1 and 2
2
>>> 1 and 0
0
>>> 1 and "Hello World"
"Hello World"
>>> "" and "Pancakes"
""
または演算子
or
オペレータは、左から右に式を評価し、評価に最初の値を返しますTrue
(何もしない場合、または最後の値True
)。
>>> 1 or 2
1
>>> None or 1
1
>>> 0 or []
[]
レイジー評価
このアプローチを使用する場合は、評価が怠惰であることに注意してください。結果を決定するために評価する必要のない式は評価されません。例えば:
>>> def print_me():
print('I am here!')
>>> 0 and print_me()
0
上記の例では、 print_me
は決して実行されません。なぜなら、Pythonは0
( False
)に遭遇すると式全体がFalse
判断できるからです。プログラムロジックを提供するためにprint_me
を実行する必要がある場合は、このことを覚えておいてください。
複数の条件のテスト
複数の条件をチェックする際のよくある間違いは、ロジックを誤って適用することです。
この例では、2つの変数がそれぞれ2より大きいかどうかをチェックしようとしています。この文は、-if if (a) and (b > 2)
として評価されます。 bool(a)
は、 a
が0でない場合にTrue
評価されるため、予期しない結果になります。
>>> a = 1
>>> b = 6
>>> if a and b > 2:
... print('yes')
... else:
... print('no')
yes
各変数は別々に比較する必要があります。
>>> if a > 2 and b > 2:
... print('yes')
... else:
... print('no')
no
変数が複数の値のいずれかであるかどうかをチェックする際にも、同様の間違いがあります。この例のステートメントは、 - if (a == 3) or (4) or (6)
として評価されます。これは、 bool(4)
とbool(6)
それぞれTrue
評価されるため、予期しない結果になりTrue
>>> a = 1
>>> if a == 3 or 4 or 6:
... print('yes')
... else:
... print('no')
yes
再度、各比較は別々に行わなければならない
>>> if a == 3 or a == 4 or a == 6:
... print('yes')
... else:
... print('no')
no
in演算子を使用するのが標準的な方法です。
>>> if a in (3, 4, 6):
... print('yes')
... else:
... print('no')
no
真実の価値
次の値は、ブール演算子に適用されたときにFalse
と評価されるため、 False
とみなされます。
- 無し
- 偽
-
0
、または、例えばゼロに相当する任意の数値、0L
、0.0
、0j
- 空のシーケンス:
''
、""
、()
、[]
- 空のマッピング:
{}
-
__bool__
または__len__
メソッドが0またはFalse
返すユーザー定義型
Pythonの他のすべての値はTrue
評価されTrue
。
注:よくある間違いは、違いが重要な場合に異なる虚偽の値を返す操作の偽を単にチェックすることです。たとえば、 if foo()
がより明示的ではif foo() is None
cmp関数を使用して2つのオブジェクトの比較結果を取得する
Python 2にはcmp
関数が含まれています。この関数を使用すると、あるオブジェクトが別のオブジェクトよりも小さいか等しいか大きいかを判断できます。この関数は、これらの3つのオプションのいずれかに基づいてリストから選択肢を選択するために使用できます。
x > y
'greater than'
場合は'greater than'
'less than'
、 x < y
'less than'
場合は'less than'
'equal'
、 x == y
'equal'
場合は'equal'
を印刷する必要があるとします。
['equal', 'greater than', 'less than', ][cmp(x,y)]
# x,y = 1,1 output: 'equal'
# x,y = 1,2 output: 'less than'
# x,y = 2,1 output: 'greater than'
cmp(x,y)
は以下の値を返します
比較 | 結果 |
---|---|
x <y | -1 |
x == y | 0 |
x> y | 1 |
この機能は、あなたが使用できるのPython 3で除去されcmp_to_key(func)
に位置してヘルパー関数functools
キー機能を旧比較関数を変換するためのPython 3でを。
リスト内包表記による条件式評価
Pythonでは、リスト内包表記をハックして条件式を評価することができます。
例えば、
[value_false, value_true][<conditional-test>]
例:
>> n = 16
>> print [10, 20][n <= 15]
10
ここでn<=15
はFalse
返します(これはPythonでは0になります)。だからPythonが評価しているものは次のとおりです。
[10, 20][n <= 15]
==> [10, 20][False]
==> [10, 20][0] #False==0, True==1 (Check Boolean Equivalencies in Python)
==> 10
組み込みの__cmp__
メソッドは3つの可能な値を返しました:0,1、-1、cmp(x、y)が返された0:両方のオブジェクトが同じ場合1:x> y -1:x <y
これは、リスト内包表記とともに、リストの最初の(つまり、インデックス0)、2番目の(つまりインデックス1)、最後の(つまりインデックス-1)の要素を返すために使用できます。私たちにこのタイプの条件を与えます:
[value_equals, value_greater, value_less][<conditional-test>]
最後に、上記のすべての例で、Pythonは両方のブランチを評価する前に両方のブランチを評価します。選択したブランチだけを評価するには:
[lambda: value_false, lambda: value_true][<test>]()
最後に()
を追加すると、最後にラムダ関数が呼び出され/評価されることが保証されます。したがって、選択した分岐のみを評価します。
例:
count = [lambda:0, lambda:N+1][count==N]()
オブジェクトがNoneであるかどうかをテストし、それを割り当てる
オブジェクトが割り当てられていないことを示すNone
場合、そのオブジェクトに何かを割り当てることがよくあります。私たちはaDate
を使用しaDate
。
これを行う最も簡単な方法is None
テストを使用することis None
。
if aDate is None:
aDate=datetime.date.today()
(Pythonicという言葉is None
、 == None
ではなくis None
あることに注意してください)。
しかし、これは、 not None
がブール式でTrue
と評価されnot None
という概念を利用することによってわずかに最適化できます。以下のコードは同等です:
if not aDate:
aDate=datetime.date.today()
しかしもっとPythonの方法があります。次のコードも同じです:
aDate=aDate or datetime.date.today()
これは短絡評価を行います。 aDate
が初期化されてnot None
でnot None
場合、ネット効果not None
でそれ自体に割り当てられます。 is None
場合、 datetime.date.today()
はaDate
に割り当てられaDate
。