Pythonのif文による条件分岐の書き方
Pythonのif文による条件分岐について説明する。
- if文の基本(if, elif, else)
- 比較演算子などで条件を指定
- 数値やリストなどで条件を指定
- 論理演算子(and, or, not)で複数条件や否定を指定
- 条件式を改行して複数行で記述
条件分岐を一行で記述する三項演算子もある。以下の記事を参照。
if文の基本(if, elif, else)
if文の基本的な形は以下のようになる。
if 条件式1:
`条件式1がTrueのときに行う処理`
elif 条件式2:
`条件式1がFalseで条件式2がTrueのときに行う処理`
elif 条件式3:
`条件式1, 2がFalseで条件式3がTrueのときに行う処理`
...
else:
`すべての条件式がFalseのときに行う処理`
elifはC言語などにおけるelse ifに相当し、何個あってもよい。
条件式が一つだけの場合やFalseのときの処理が必要ない場合は、elifブロックとelseブロックは省略可能。
比較演算子などで条件を指定
比較演算子などのbool型(Ture, False)を返す演算で条件を指定する。
Pythonの比較演算子は以下の通り。
| 演算子 | 結果 |
|---|---|
x < y |
xがyより小さければTrue |
x <= y |
xがyより小さいか等しければTrue |
x > y |
xがyより大きければTrue |
x >= y |
xがyより大きいか等しければTrue |
x == y |
xとyの値が等しければTrue |
x != y |
xとyの値が等しくなければTrue |
x is y |
xとyが同じオブジェクトであればTrue |
x is not y |
xとyが同じオブジェクトでなければTrue |
x in y |
xがyに含まれていればTrue |
x not in y |
xがyに含まれていなければTrue |
例を示す。便宜上、def文で関数として定義している。
def if_test(num):
if num > 100:
print('100 < num')
elif num > 50:
print('50 < num <= 100')
elif num > 0:
print('0 < num <= 50')
elif num == 0:
print('num == 0')
else:
print('num < 0')
if_test(1000)
# 100 < num
if_test(70)
# 50 < num <= 100
if_test(0)
# num == 0
if_test(-100)
# num < 0
Pythonならではの書き方として、a < x < bというような書き方もできる。詳細は以下の記事を参照。
def if_test2(num):
if 50 < num < 100:
print('50 < num < 100')
else:
print('num <= 50 or num >= 100')
if_test2(70)
# 50 < num < 100
if_test2(0)
# num <= 50 or num >= 100
==, !=は値の比較で、オブジェクトの同一性を比較するにはis, is notを使う。
例えば、整数intと浮動小数点数floatを比較する場合、値が等価であれば==はTrueを返すが、異なるオブジェクトなのでisはFalseを返す。
i = 10
print(type(i))
# <class 'int'>
f = 10.0
print(type(f))
# <class 'float'>
print(i == f)
# True
print(i is f)
# False
リストや文字列に特定の要素(文字)が含まれているかを条件にすることも可能。in(含む)、not in(含まない)を使う。
def if_test_in(s):
if 'a' in s:
print('a is in string')
else:
print('a is NOT in string')
if_test_in('apple')
# a is in string
if_test_in('melon')
# a is NOT in string
数値やリストなどで条件を指定
if文の条件式には、bool型(True, False)ではない数値やリストなどのオブジェクトを指定することもできる。
if 10:
print('True')
# True
if [0, 1, 2]:
print('True')
# True
Pythonのif文の条件式において、偽Falseとみなされるのは以下のオブジェクト。
- 偽であると定義されている定数:
NoneとFalse.- 数値型におけるゼロ:
0,0.0,0j,Decimal(0),Fraction(0, 1)- 空のシーケンスまたはコレクション:
'',(),[],{},set(),range(0)組み込み型 - 真理値判定 — Python 3.8.5 ドキュメント
ゼロを表す数値や、空の文字列やリストなどは偽Falseとみなされ、それ以外はすべて真Trueとみなされる。
オブジェクトがどう判定されるかはbool()で確認できる。
print(bool(10))
# True
print(bool(0.0))
# False
print(bool([]))
# False
print(bool('False'))
# True
これを利用すると、リストが空の場合の処理などがシンプルに書ける。
def if_test_list(l):
if l:
print('list is NOT empty')
else:
print('list is empty')
if_test_list([0, 1, 2])
# list is NOT empty
if_test_list([])
# list is empty
上の例にあるように、文字列において空の文字列''以外はTrueとなるため、'False'という文字列もTrueとなるので注意。'True'や'False'など特定の文字列を1, 0に変換するにはdistutils.utilモジュールのstrtobool()を使う。以下の記事を参照。
論理演算子(and, or, not)で複数条件や否定を指定
論理演算子(and, or, not)を使うことで、複数の条件の論理積(かつ)や論理和(または)、否定(でない)を扱うことができる。
| 演算子 | (if文の条件式での)結果 |
|---|---|
x and y |
xもyもTrueであればTrue |
x or y |
xとyいずれかがTrueであればTrue |
not x |
xがTrueであればFalse、x がFalseであればTrue |
def if_test_and_not(num):
if num >= 0 and not num % 2 == 0:
print('num is positive odd')
else:
print('num is NOT positive odd')
if_test_and_not(5)
# num is positive odd
if_test_and_not(10)
# num is NOT positive odd
if_test_and_not(-10)
# num is NOT positive odd
なお、実際はx and yとx or yはTrue, Falseではなくx, yいずれかの値を返す。if文の条件式で使う限りは、その値がTrueかFalseのいずれかに評価されるので特に気にする必要はない。詳細は以下の記事を参照。
andやorを複数回使用することも可能。
def if_test_and_not_or(num):
if num >= 0 and not num % 2 == 0 or num == -10:
print('num is positive odd or -10')
else:
print('num is NOT positive odd or -10')
if_test_and_not_or(5)
# num is positive odd or -10
if_test_and_not_or(10)
# num is NOT positive odd or -10
if_test_and_not_or(-10)
# num is positive odd or -10
条件式を改行して複数行で記述
複数の条件式をandやorで接続して使う場合などで一行が長くなると、条件式を改行して複数行で記述したいときがある。
バックスラッシュ\を使うか、全体を括弧()で囲むことで改行が可能。
def if_test_and_backslash(num):
if num >= 0 \
and not num % 2 == 0:
print('num is positive odd')
else:
print('num is NOT positive odd')
if_test_and_backslash(5)
# num is positive odd
def if_test_and_brackets(num):
if (num >= 0
and not num % 2 == 0):
print('num is positive odd')
else:
print('num is NOT positive odd')
if_test_and_brackets(5)
# num is positive odd
バックスラッシュ\を使えば何度改行してもいい。同じく、括弧()内であれば何度改行してもいい。インデントの制限もない。
なお、これはif文に限ったことではなくPythonのコードどこでも使えるテクニック。
- 関連記事: Pythonで長い文字列を複数行に分けて書く