Python | if文(if, elif, else)を学習した

2021-07-03

こんにちは。

最近はPythonを学習しています。

Pythonを動かしている環境については簡単に言うと以下です。

  • Windows 10 64bit
  • python 3.9.4
  • PyCharm Community Edition 2021.1 x64

より詳細は以下の記事に記載してあります。

今回はPythonによるプログラミングについて、if文(if, elif, else)の基本的な使い方を試してみました。この記事は学習内容の備忘録です。

if文

例えば、「点数が80点以上ならば、Passという文字を出力する」という処理は条件分岐の処理です。Pythonでは次のようにif文で実装することができます。

ソース
score = int(input('score: '))

if score >= 80:
    print('Pass')

print('End')

一行目の組み込み関数input()ではコンソールから値を入力を待つ関数です。以下は、80を入力した場合、79を入力した場合の結果です。

80を入力した結果
score: 80
Pass
End
79を入力した結果
score: 79
End

上記では80を入力した場合、文言Passが出力されています。79を入力した場合、出力されていません。上記のように、if文によって値を判定して処理を分岐することが出来ます。

if文の基本的な構文は以下です。

ソース
if [条件式]:
    [実行させたい処理1]
    [実行させたい処理2]
    [実行させたい処理3]
    .
    .
    .

条件式がTrueのときに実行させたい処理は、ひとつインデントさせます。上記のインデントさせた一連の文は、Python 3.9.4 ドキュメントでは、スイート (suite)と呼ばれます。

条件式では比較演算子が使われることが多いと思います。以前の記事「比較演算子を学習した」に学習した内容の備忘録を載せてます。

ブール演算

2つのスコアを入力させるとします。2つのスコアが両方80点以上であるか判定したい場合、論理演算子を使うことができます。

以下のサンプルプログラムでは、2つのスコアが両方80点以上の場合に、Passを出力します。

ソース
score1 = int(input('score1: '))
score2 = int(input('score2: '))

if score1 >= 80 and score2 >= 80:
    print('Pass')

print('End')
結果
score1: 80
score2: 80
Pass
End
結果
score1: 80
score2: 79
End

2つの条件A、Bの論理演算について、つぎの演算子を使うことが出来ます。

結果
A and B AとB両方Trueの場合、True。それ以外はFalse。
A or B AとB少なくとも一方がTrueの場合、True。それ以外はFalse。

以下のサンプルプログラムでは、実際にAとBにTrue/Falseを設定して、andとorの結果を出力してみました。

ソース
print('{:>10}, {:>10}, {:>10}, {:>10}'
      .format('A', 'B', 'A and B', 'A or B'))

A = True
B = True
print('{:>10}, {:>10}, {:>10}, {:>10}'
      .format(str(A), str(B), str(A and B), str(A or B)))

A = True
B = False
print('{:>10}, {:>10}, {:>10}, {:>10}'
      .format(str(A), str(B), str(A and B), str(A or B)))

A = False
B = True
print('{:>10}, {:>10}, {:>10}, {:>10}'
      .format(str(A), str(B), str(A and B), str(A or B)))

A = False
B = False
print('{:>10}, {:>10}, {:>10}, {:>10}'
      .format(str(A), str(B), str(A and B), str(A or B)))
結果
         A,          B,    A and B,     A or B
      True,       True,       True,       True
      True,      False,      False,       True
     False,       True,      False,       True
     False,      False,      False,      False

なお、上記サンプルプログラムでは組み込み関数str()を使っています。この関数を使わない場合、True/Falseの代わりに1/0が出力されました。

ソース
print('{:>10}, {:>10}, {:>10}, {:>10}'
      .format('A', 'B', 'A and B', 'A or B'))

A = True
B = False
print('{:>10}, {:>10}, {:>10}, {:>10}'
      .format(A, B, A and B, A or B))
結果
         A,          B,    A and B,     A or B
         1,          0,          0,          1

条件Aの否定を取得したい場合は、以下の演算子notがあります。

結果
not A AがTrueの場合、False。それ以外はTrue。

以下のサンプルプログラムではnot Aの結果を出力しています。

ソース
print('{:>10}, {:>10}'
      .format('A', 'not A'))

A = True
print('{:>10}, {:>10}'
      .format(str(A), str(not A)))

A = False
print('{:>10}, {:>10}'
      .format(str(A), str(not A)))
結果
         A,      not A
      True,      False
     False,       True

else

入力した点数scoreに応じて、以下のようにある条件を満たす場合/それ以外の場合で出力を分けるとします。

  1. scoreが80以上の場合、「Pass」を出力。
  2. それ以外の場合、「Failure」を出力。

このような分岐処理を実装したい場合、次のようにelseを使います。

ソース
score = int(input('score: '))

if score >= 80:
    print('Pass')
else:
    print('Failure')

print('End')
80を入力した結果
score: 80
Pass
End
79を入力した結果
score: 79
Failure
End

上記のように、指定した条件「変数scoreの値が80以上」がTrueの場合、ifの次の行のスイートが実行されます。それ以外の場合(指定した条件がFalseの場合)、elseの次の行のスイートが実行されます。

pass文

「ある条件を満足する場合は何もしない」という分岐処理があるとします。

例えば、以下の処理があるとします。

  1. scoreが80以上の場合、何もしない
  2. それ以外の場合、「Work harder.」を出力。

このような場合は、以下のようにpass文を使います。

ソース
score = int(input('score: '))

if score >= 80:
    pass
else:
    print('Work harder.')

print('End')
80を入力した結果
score: 80
End
79を入力した結果
score: 79
Work harder.
End

言語によっては空行にすれば良い場合もありますが、Pythonではpass文が必要です。pass文を書かない場合、Pycharmではelseの先頭に赤線が引かれました。

ファイルを実行すると以下のようにエラーが出力されました。

pass文がない場合の結果
  File "C:\Users\[user name]\PycharmProjects\pythonProject0001\0005\test0041.py", line 5
    else:
    ^
IndentationError: expected an indented block

elif

以下のように、条件1を満たす場合の処理、条件2を満たす場合の処理が指定されていたとします。

  1. scoreが80以上の場合、「A」を出力。
  2. scoreが75以上の場合、「B」を出力。
  3. scoreが50以上の場合、「C」を出力。

このような場合は以下のように、elifを使います。

ソース
score = int(input('score: '))

if score >= 80:
    print('A')
elif score >= 75:
    print('B')
elif score >= 50:
    print('C')

print('End')
80を入力した結果
score: 80
A
End
70を入力した結果
score: 75
B
End
50を入力した結果
score: 50
C
End

上記のように、elifを使うことで条件分岐を追加することができます。

今度は、以下のような、最後に「それ以外」という条件があったとします。

  1. scoreが80以上の場合、「A」を出力。
  2. scoreが75以上の場合、「B」を出力。
  3. scoreが50以上の場合、「C」を出力。
  4. それ以外の場合、「D」を出力。

このような場合は以下のように、最後にelseを使います。

ソース
score = int(input('score: '))

if score >= 80:
    print('A')
elif score >= 75:
    print('B')
elif score >= 50:
    print('C')
else:
    print('D')
49を入力した結果
score: 49
D
End

上記のように、elifは複数使うことが出來、必要なら最後にelseを使うことができます。

入れ子

以下のように、点数が80以上の時にAを出力し、さらに点数が90以上の場合、「Good work.」を出力するという処理があったとします。

  1. scoreが80以上の場合、「A」を出力。
    1. scoreが90以上の場合、「Good Work.」を出力。
  2. scoreが75以上の場合、「B」を出力。
  3. scoreが50以上の場合、「C」を出力。
  4. それ以外の場合、「D」を出力。

上記のような条件分岐が入れ子になっている場合、以下のようにインデントを使うことで実装することができます。

ソース
score = int(input('score: '))

if score >= 80:
    print('A')
    if score >= 90:
        print('Good work.')
elif score >= 75:
    print('B')
elif score >= 50:
    print('C')
else:
    print('D')

print('End')
90を入力した結果
score: 90
A
Good work.
End
89を入力した結果
score: 89
A
End

上記のサンプルプログラムでは、最初のif文では、スイートに第2のif文が記述されています。その第2のif文に対応するスイートを記述するには、インデントをひとつ増やします。

以上、参考になれば幸いです。