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

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

  

IF文の前提

if文の書式は下の通りです。

if 条件式:
    処理1...
elif 条件式:
    処理2...
else:
    処理3...
ifelif処理1処理2処理3
TrueTrue実行
TrueFalse実行
FalseTrue実行
FalseFalse実行

条件式が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を返します。
空リストや数値、文字列なども上述の判定と同様になされます。

 

SNSでもご購読できます。

コメントを残す

*

日本語が含まれない投稿は無視されますのでご注意ください。