4. 選択構造

選択構造は、条件によって処理する内容を変えることができる構造です。
Pythonでは主にif文で選択処理を行います。

if文の書き方

Pythonにおけるif文の一般的な記法は以下のとおりです。

if 条件:
	処理1
	
else:
	処理2

if文では、

  1. if句の条件が真の時(条件が成立する時):if句下のインデント箇所である処理1が実行されます。
  2. if句の条件が偽の時(条件が成立しない時):else句以下のインデント箇所である処理2が実行されます。

各処理は、インデントして記述します。インデントする処理の行数は複数行でも構いません。

例題1では、変数aの値が0より大きいかどうかを判定し、結果に応じてメッセージを出力するプログラムを作成します。変数a2が代入されており、a < 0は偽となるため、if句の条件を満たさずif句下の処理(print("aは0以下です"))は実行されません。if句の条件を満たさなかったため、代わりにelse句下の処理(print("aは0より大きいです"))が実行されます。

例題1
a = 2
if a < 0:
	print("aは0以下です")
else:
	print("aは0より大きいです")
print("end")

なお、else句を用いずに以下のようにif句のみ記述することもできます。

if 条件:
	処理1
処理2

この場合、条件を満たす場合のみ「処理1」を行うようになるので、

という流れになります。

複数の条件

if文において、複数の条件を指定することもできます。複数の条件を指定する場合は、elif句を用います。

if 条件1:
	処理1
elif 条件2:
	処理2
else:
	処理3

elif句は、if句の条件が偽で、かつelif句の条件が真の場合に、elif句下の処理(処理2)が実行されます。elif句の条件が偽の場合は、else句下の処理(処理3)が実行されます。

例題2
a = 0
if a < 0:
	print("aは0以下です")
elif a == 0:
	print("aは0です")
else:
	print("aは0より大きいです")
print("end")

例題2では、変数aの値と0との比較を行い、結果に応じてメッセージを出力するプログラムを作成します。変数a0が代入されており、if文の各句での条件判定は以下の通りです。

  1. if a < 0::変数aの値は0であり、a < 0を満たさないため、この条件は偽となり、if句下の処理は実行されません。
  2. elif a == 0::変数aの値は0であり、a == 0を満たすため、この条件は真となり、elif句下の処理(print("aは0です"))が実行されます。
  3. else:elif句の条件を満たし、elif句下の処理が実行されたため、else句下の処理は実行されません。

elif句は複数記述することができます。複数のelif句を記述する場合は、以下のように記述します。

if 条件1:
	処理1
elif 条件2:
	処理2
elif 条件3:
	処理3
else:
	処理4

つまり、else句というのは、すべてのif句やelif句の条件が成立しなかった場合に実行される処理を指します。

条件の注意ごと

# 間違った書き方の例
if 条件1:
	処理1
else 条件2: # else句には条件を書くことはできない
	処理2
elif 条件3: # elif句はif句の後に書く。else句の後に書くことはできない
	処理3

また、判定は上から順に行われ、条件を満たす処理がある場合、それ以降の処理は行われません。

例題3
a = 2
if a > 0:
	print("aは0以上です")
elif a == 2:
	print("aは2です")
print("end")

例題3では、変数a2が代入されており、if句のa > 0およびelif句のa == 2の条件のどちらも成立します。しかし、判定は上から順に行われるため、if句の条件が成立した時点で処理が終了し、elif句の条件は判定されません。そのため、print("aは2です")は実行されません。

もしどちらも出力したい場合は、例題4ように別々のif句として記述するとよいでしょう。

例題4
a = 2
if a > 0:
	print("aは0以上です")
if a == 2:
	print("aは2です")
print("end")

論理演算子

複数の条件を組み合わせて判定する場合、論理演算子を使うことができます。Pythonには以下の論理演算子があります。

例題5
a = 2
b = -5

if a > 0 and b > 0:
	print("aとbはともに0より大きいです")

if a > 0 or b > 0:
	print("aまたはbは0より大きいです")

if not a < 0:
	print("aは0より小さくありません")

print("end")

2重のif

for文やwhile文同様、if文の中に、さらにインデントして別のif文を記述することもできます。このように、複数の条件分岐を組み合わせることで、複雑な条件を表現することができます。

例題6
a = 2
b = 3
if a == 2:
    print("a is 2")
    if b == 3:
        print("b is 3")
    else:
        print("b is not 3")
elif a == 3:
    print("a is 3")

if b == 3:
    print("b is 3")

print("end")

まとめ

選択構造は、条件によって処理を変えることができる構造です。
Pythonでは主にif文で選択処理を行います。

if 条件:
	処理1
else:
	処理2

また、複数の条件を指定する場合は、elif句を用いることができます。複数の条件を組み合わせて判定する場合、論理演算子を使うことができます。

if 条件1:
	処理1
elif 条件2:
	処理2
else:
	処理3
if 条件1 and 条件2:
	処理1
if 条件1 or 条件2:
	処理2
if not 条件:
	処理3

問題1

数字num0~999の間のいずれかの数字を代入するとします。 この数字numの桁数を判定し、以下のように条件に応じたメッセージを出力するプログラムを作成する。 (※ただし、numには代入された数字が入る)

「ア」と「イ」に当てはまる適切な回答を選び、プログラムを完成させてください。

num = ... # 0~999の範囲の数字が入る
if num「ア」0 and num < 10:
	print(f"「{num}」は1桁の数字です")
elif num「ア」10 and num < 100:
	print(f"「{num}」は2桁の数字です")
「イ」:
	print(f"「{num}」は3桁の数字です")

答え:ア:>=、 イ:else

「ア」について: 0~9の範囲および、10~99の範囲の数字を判定するためには、num0以上かつ10未満、または10以上かつ100未満であることを判定する必要があります。そのため、>=を用いて0以上かつ10未満を判定する必要があります。ゆえに、「ア」は>=となります。

「イ」について: if句およびelif句で0~99の範囲の数字に関しての処理を行っているため、else句を用いれば、のこりの100~999の範囲の数字に関しての処理を行うことができます。また、elif句を使う場合は条件をあわせて記述する必要があり、単体での使用は不適です。そのため、「イ」はelseとなります。

作成したプログラムが桁数に応じて正しく出力が変わるかを確認するために、for文を用いて1, 23, 456の3つの数字に対してそれぞれの出力を確認してみましよう:

問題1
for num in [1, 23, 456]:
	if num >= 0 and num < 10:
		print(f"「{num}」は1桁の数字です")
	elif num >= 10 and num < 100:
		print(f"「{num}」は2桁の数字です")
	else:
		print(f"「{num}」は3桁の数字です")

このプログラムを実行すると、それぞれの数字に対して正しい出力がされることが分かります。