Python基礎講座 #13 if条件文 (if statement)

読了 8分

今回の講座では、Pythonの制御文の中で最も基本となるif条件文について勉強していきましょう。

if条件文の基本構造はifブロック、elifブロック、elseブロックで構成されています。それぞれのブロックは、テスト式の部分と、テストを通過すると実行されるbody部分で構成されます。テストの結果値がTrueの場合、body部分のコードが実行され、Falseの場合は次のelifブロックのテストを実行し、すべてのテスト結果がFalseであればelseブロックbodyのコードが実行されます。

if制御文のフローチャート
if制御文のフローチャート

if条件文を実際のコードでは、通常以下のような構造を持ちます。

if a == b: print(‘1番目の条件が真です’) elif a == c: print(‘2番目の条件が真です’) else: print(‘上のどの条件も真ではありません’) さらに条件を追加したい場合は、以下のようにelifブロックを追加してください。

if a == b:
    print('1番目の条件が真です')
elif a == c:
    print('2番目の条件が真です')
elif a == d:
    print('3番目の条件が真です')
elif a == e:
    print('4番目の条件が真です')
elif a == f:
    print('5番目の条件が真です')
else:
    print('どの条件も真ではありません')

if条件文を使って、aとb変数に保存された2つの数を比較してみましょう。

>>> a = 1
>>> b = 2

2つの数を比較したときの場合の数は3通りあります。

a > b
a == b
a < b

次のようなif条件文ですべての場合の数を処理することができます。

>>> if a > b:
...     print('a > b')
... elif a == b:
...     print('a == b')
... else:
...     print('a < b')
...
a < b

elseブロックが実行され、aがbより小さいという正常な結果が得られました。

たまにif文を間違って使う方を見かけますが、次のような使い方は間違った使い方です。

>>> if a > b:
...     print('a > b')
...
>>> if a == b:
...     print('a == b')
...
>>> if a < b:
...     print('a < b')
...
a < b

結果は上のコードを実行したときと同じ値を出力しましたが、このコードには問題があります。elif文を使えば、1つの条件を満たすとそれ以降のテストは実行しません。しかし上の良くない例のようにif文を使うと、求める答えを見つけても、それ以降の不要なテストまで実行してしまいます。このような間違った使い方は、場合によっては深刻なリソースの浪費とプログラムのパフォーマンス低下につながります。

次は、場合の数が3個より多い場合にif条件文をどのように使うかを見ていきましょう。たとえば5種類の果物の名前の中から、ユーザーから直接入力を受けて果物の名前を当てるプログラムを作るとしましょう。このときの場合の数は、果物の数5個と、間違った果物の名前を入力したときの場合1個を合わせて、合計6通りの場合の数があります。このような場合は複数のelif文を使う必要があります。

>>> answer = 'いちご'
>>>
>>> if answer == 'バナナ':
...     print('バナナは正解です。')
... elif answer == 'いちご':
...     print('いちごは正解です。')
... elif answer == 'りんご':
...     print('りんごは正解です。')
... elif answer == 'オレンジ':
...     print('オレンジは正解です。')
... elif answer == 'スイカ':
...     print('スイカは正解です。')
... else:
...     print('{}は正解ではありません'.format(answer))
...
いちごは正解です。

次のように果物の名前をリストに保存し、果物リストのアイテムを確認する構文でより簡潔なコードを作ることができます。

>>> fruits = ['バナナ', 'いちご', 'りんご', 'オレンジ', 'スイカ']
>>>
>>> if answer in fruits:
...     print('{}は正解です'.format(answer))
... else:
...     print('{}は正解ではありません'.format(answer))
...
いちごは正解です

if条件文を使っていると、2つ以上の条件をテストしなければならない場合があります。このような場合はネストしたif文を使ってください。

問題: 以下の条件を両方とも満たす数を見つけてください。

条件1: x > 0 条件2: x < 3 最も小さい正の数を見つける問題があるとすれば、条件1である正の数という条件と、条件2である3より小さい数という条件の両方を満たす答えを見つける必要があります。この問題を解決するためには、次のようなネストしたif文を作ってください。

answer = int(input('数字を入力してください: '))

if answer > 0:
    if answer < 3:
        print('{}は正解です'.format(answer))
    else:
        print('{}は正解ではありません'.format(answer))
else:
    print('{}は正解ではありません'.format(answer))

ネストした条件文は、次のようにandキーワードを使って1つの複合条件文にすることもできます。

answer = int(input('数字を入力してください: '))

if answer > 0 and answer < 3:
    print('{}は正解です'.format(answer))
else:
    print('{}は正解ではありません'.format(answer))

今度はorキーワードを使って、2つのif文を1つにする方法をお見せします。

問題: 以下の条件のうち、1つ以上の条件を満たす数を見つけてください。

条件1: x < 3 条件2: x > 6 今回の問題の条件は、3より小さいか6より大きい数を見つけることです。上の例のようにネストしたif文を使ってください。

answer = int(input('数字を入力してください: '))

if answer < 3:
    print('{}は正解です'.format(answer))
else:
    if answer > 6:
        print('{}は正解です'.format(answer))
    else:
        print('{}は正解ではありません'.format(answer))

別の方法は、新しい変数を定義して2つの条件のうち1つを満たせば、新しく定義した変数の値をTrueに変更する方法です。

answer = int(input('数字を入力してください: '))
flag = None

if answer < 3:
    flag = True

if answer > 6:
    flag = True

if flag:
    print('{}は正解です'.format(answer))
else:
    print('{}は正解ではありません'.format(answer))

上のコードはorキーワードを使って次のような簡単なコードにすることができます。

answer = int(input('数字を入力してください: '))

if answer < 3 or answer > 6:
    print('{}は正解です'.format(answer))
else:
    print('{}は正解ではありません'.format(answer))

💡 今日のヒント

ネストしたif文があまりに多くなるとコードが複雑になり可読性が下がるので、1つの複合条件文にまとめるのが良いでしょう。

if条件文のテストは、すべての条件をbooleanオブジェクトに変換してTrueかFalseかを判断します。Pythonでは、booleanオブジェクトに変換したときにFalseの値になるオブジェクトがいくつかあります。

以下のオブジェクトは、if文でbooleanオブジェクトに変換したときにFalseとして扱われます。

  • False
  • None
  • Integer 0
  • 空のstring
  • 空のlist
  • 空のtuple
  • 空のdictionary 上のオブジェクトをbool関数を使ってbooleanオブジェクトに変換してみましょう。
>>> bool(False)
False
>>> bool(None)
False
>>> bool(0)
False
>>> bool('')
False
>>> bool([])
False
>>> bool(())
False
>>> bool({})
False

それでは、実際にif文の中でこの値が偽を意味するか確認してみましょう。

>>> if condition == True:
...     print('真です')
... else:
...     print('偽です')
...
偽です

分かりやすいようにconditionがTrueと等しければ、という条件を使いましたが、この部分は次のように省略できます。

>>> condition = {}
>>>
>>> if condition:  # True を省略可能
...     print('真です')
... else:
...     print('偽です')
...
偽です

これを活用して、ある値が0でない場合の条件は、次のような条件文に置き換えることができます。

x = 1

if x != 0:
    print('x は 0 ではありません')

if x:
    print('x は 0 ではありません')

以下のようにnot演算子を使ってTrue値をFalseに変えることもできます。

x = 0

if x == 0:
    print('x は 0 です')

if not x:
    print('x は 0 です')

また、リストの長さが0より大きいときのような条件は、リストがアイテムを1つも持っていなければFalseで、アイテムを1つでも持っていればTrueなので、次のようにもう少し簡単なコードに置き換えることができます。

my_list = [1, 2, 3]

if len(my_list) > 0:
    print('my_list は1つ以上のアイテムを持っています')

if my_list:
    print('my_list は1つ以上のアイテムを持っています')

if条件文の使用は難しくはないですが、間違って使うとプログラム全体の構造を壊し、プログラムのパフォーマンスを低下させる可能性もあるので、しっかり身に着けてください。

次の講座では、while反復文について勉強していきましょう。

X