2020-02-11

[Python3] if文の制御について

Python3.xにおけるifの挙動をまとめます。
  

IF文の前提


if文の書式は下の通りです。
if 条件式:
処理1...
elif 条件式:
処理2...
else:
処理3...

if elif 処理1 処理2 処理3
True True 実行 - -
True False 実行 - -
False True - 実行 -
False False - - 実行

条件式がTrueのときにその直下のインデントに記載された処理のみを実行します。
ifでTrueだった場合にはelifやelseの処理は実行されません。
elifやelseが不要な場合には省略することができます。
実際のコードで確認すると下のとおりです。
a = True
b = False
if a:
print('Trueを出力します')
if b:
print('Falseなので出力されません')

文字列


while True:
strings = input('なにか文字をいれてください:')
if strings:
print(True)
else:
print(False)
>>> なにか文字をいれてください:
>>> False
>>> なにか文字をいれてください:TEST
>>> True

なにか文字を入力するとTrueとなります。空文字のときだけFalseです。
>>> print('A' > 'B')
>>> True
>>> print('C' > 'A')
>>> False

文字列の大小も比較可能です。

数字


while True:
nums = int(input('なにか数字をいれてください:')
if nums:
print(True)
else:
print(False)
>>> なにか数字をいれてください:0
>>> False
>>> なにか数字をいれてください:1
>>> True
>>> なにか数字をいれてください:-1
>>> True
>>> なにか数字をいれてください:0.0
>>> False

数値を条件式に入れた場合0はFalse、それ以外はすべてTrueです。
False=0, True=1が基本ですが、0かそれ以外かで処理を分岐させる使い方も可能です。
なお、str型の0、0.0はTrueとなります。

リスト・辞書・集合


if []:
print(True)
if {}:
print(True)
>>> (出力なし)

空リスト、空集合はFalseとなります。
if [1 ,2, 3, 'a']:
print(True)
>>> True
if {'key': 0}:
print(True)
>>> True
if {1, 2, 3}:
print(True)
>>> True

リスト・辞書・集合に値が含まれる場合にはTrueが返されます。
ゆえにpep8では以下の書き方はしません。
# Bad
if len([0, 1, 2]):
print(True)

is


None


c = None
if c is None:
print(True)
>>> True

type


e = ['a', True, 0, 0.0]
for val in e:
if type(val) is str:
print('str', end='\t')
elif type(val) is float:
print('float', end='\t')
else:
print('Other', end='\t')
>>> str Other Other float

①==では正しく判定されないケースがある、②速度が早いの2点から
NoneやTypeの比較には必ずisを使います。

条件式の順序


fruits = {
'apple': 1,
'peach': 4,
'pineapple': 3,
'kiwi': 2,
}
if fruits['banana']:
print(True)
>>> KeyError: 'banana'
if 'banana' in fruits and fruits['banana']:
print(True)
else:
print(False)
>>> False

条件式は左から順番に評価されます。andの場合には左辺がFalseとなった時点で
False判定となります。辞書に存在しないキーを参照するとエラーが生じますが、
条件式でbananaキーがない(False)を確認した時点で、
右辺の条件確認を省略していることが上のコードから確認できます。

条件式をまとめる


n = 65
if 100 > n and n > 30:
print(True)

複数条件がある場合にandを使うことがありますが、下のようにまとめることも可能です。
n = 65
if 100 > n > 30:
print(True)

リスト内の値をまとめて判定する


組み込み関数のany(), all()を使うことでリスト内のBool値等を判定することができます。
bool_list1 = [True, True, False, True]
bool_list2 = [True, True, True, True]
bool_list3 = [st.strip() for st in 'abc123 A']
# all
print(all(booll_list1))
>>> False
print(all(booll_list2))
>>> True
print(all(booll_list3))
>>> False
# any
print(any(booll_list1))
>>> True
print(any(booll_list2))
>>> True
print(any(booll_list3))
>>> True
print(any([False, False, 0]))
>>> False

all関数はすべての値がTrueにあたるものであればTrueを返し、1つでもFalseであればFalseを返します。
any関数は1つでもTrueに相当するものがあればTrueを返し、そうでなければFalseを返します。
空リストや数値、文字列なども上述の判定と同様になされます。