4. if, elif, elseによる条件分岐

プログラムを実行すると、処理はファイルの1行目から順次実行されます。処 理を分岐させるめには、人間が指示する必要があります。「if」文は条件を与 えてプログラム処理の分岐を行います。複雑な分岐処理、「if」文に論理演算 子、elifやelseを組み合わせて行います。第4回講義の目的は以下の とおりです。

  • if, elif, else文による条件分岐の文法を理解する。

  • 条件式の書式や論理演算を理解する。

if文

if」の後に 「条件式」 「 : 」とつづいて改行します。改行したら インデント(4スペース分)で処理をならべます。インデントが終わるところま でが、条件式を満たす時に処理される内容です。

if 条件式:
    条件式がTrueの時に実行する処理をインデントしてならべる。
    条件式がifが成立の時に行う処理1
    条件式がifが成立の時に行う処理2
    条件式がifが成立の時に行う処理3
    .
    .
    .
通常処理
 .
 .
 .

単語 TrueFalse はpythonで特別な意味があります。条件式の判 定結果は、 True または False として得られます。以下の例からわか るように、条件式が成立していれば、 True を成立しなければ False が判定結果として得られます。

print(3 < 5)    # True
print(3 > 5)    # False

条件式は以下のとおりです。注意点として整数の0は常にFalseになります。0以外 の整数、実数、文字列はすべてTrueです。

条件式

意味

成立(True)する条件

a == b

aとbは等しいか?

aとbは等しい時

a != b

aとbは異なるか?

aとbは異なる時

a > b

aはbより大きい?

aがbより大きい時

a >= b

aはb以上か?

aはb以上の時

a < b

aはbより大きい?

aがbより大きい時

a <= b

aはb以上か?

aはb以上の時

a

aは0以外か?

aが0以外の時、文字列0やxのような文字列もTrue

例題として、与えた整数が偶数か奇数か判定するプログラムを作ってみます。

a = 8                              # チェックする整数
amari = a % 2                      # a/2のあまりを計算
if amari == 0:                     # 整数を2で割って余りが0なら偶数
    print("{:d}は偶数".format(a))  # 偶数時の処理

もう一つ例題を示してみます。与えた文字列中に特定の文字が存在するか調 べてみます。

example-01
mojiretsu = "千葉市稲毛区"            # 文字列の定義
flag = mojiretsu.find("稲毛")         # findメソッドで文字列をチェック, flag=3
if flag > -1:                         # 0以上なら稲毛を含む
    print("{:s}は千葉を含む".format(mojiretsu), flag)

複数の条件を使って判定したい場合、論理演算(andとor)を使って条件を並べ ることができます。3つ以上の条件式も論理演算で並べることができます。

条件式

意味

成立(True)する条件

a == b and b > c

aはbと等しい かつ bはcより大きい

a=3, b=3, c=2の時など

a == b or b > c

aはbと等しい または bはcより大きい

a=3, b=3, c=10の時やa=3, b=2, c=1

論理演算子の例題は以下のとおりです。与えた数字が2と7の公約数かどうか調べてみます。

example-02
a = 14                                         # チェックする整数
if a % 2 == 0 and a % 7 == 0:                  # 7でも2でも割りきれる
    print("{:d}は2と7の公約数".format(a))      # 偶数時の処理

文字列変数を使ったif文の例も示します。

example-03
mojiretsu = "稲毛千葉"            # 文字列の定義
# 0以上なら稲毛を含む, -1なら千葉を含まない
# どちらかの条件が成立すればTrue。両方成立してもTrue
if mojiretsu.find("稲毛") > -1 or  mojiretsu.find("千葉") == -1:
    print("\"{:s}\"は稲毛を含む、または千葉を含まない。".format(mojiretsu))

else文

条件式のTrueとFalseで、処理を分けたい場合、ifとelseを組み合わせて行い ます。条件式が成り立たない場合のみ、elseブロックの処理が実行されます。

if 条件式:
    条件式1が成立するの時に実行する処理をインデントでならべる。
    条件式が成立の時に行う処理1
    条件式が成立の時に行う処理2
    条件式が成立の時に行う処理3
       .
       .
       .
else:
    条件式が成立しない時に行う処理1
    条件式が成立しない時に行う処理2
    条件式が成立しない時に行う処理3
    .
    .
    .
通常処理
.
.
.

elif文

ifで分岐してさらに条件分岐を行いたい場合はelifで分岐します。処理は上か ら流れて進んでいくので、条件式1がTrueならばブロック1の処理、条件式1が Falseで条件式2がTrueならブロック2、条件式1がFalseで条件式2がFalseなら ばブロック3が実行されます。

Flase、条件式2もFalseの場合にだけelseブロッ クの処理が実行されます。

if 条件式1:
    条件式1が成立するの時に実行する処理 (ブロック1)
    .
    .
    .
elif 条件式2:
    条件式1が成立しないで条件2が成立する時の処理 (ブロック2)
    .
    .
    .
else:
    条件式1も条件式2も成立しない時の処理 (ブロック3)
    .
    .
    .
通常処理
.
.
.

ifのネスト

if文の中にif文を入れ子にして、条件分岐を多段にできます。ネストにすると インデントが増えて見づらくなります。elifや論理演算を使った方がすっきり するでしょう。時間hourを判定して時間帯によって言葉を選択するプログラム です。

example-04
 1hour = 9
 2if hour <= 10:
 3    print("おはよう")
 4else:
 5    if hour <= 12:
 6        print("もうすく昼ごはん")
 7    else:
 8        if hour <= 18:
 9            print("こんにちわ")
10        else:
11            if hour <= 22:
12                print("こんばんわ")
13            else:
14                print("おやすみ")

次のように書いた方が直感的ですっきりします。

example-05
 1hour = 13
 2if hour <= 10:
 3    print("おはよう")
 4if 10 < hour and hour <= 12:
 5    print("もうすく昼ごはん")
 6if 12 < hour and hour <= 18:
 7    print("こんにちは")
 8if 18 < hour and hour <= 22:
 9    print("こんばんわ")
10if hour > 22:
11    print("おやすみ")

1行if, else文による代入

ifとelseの処理ブロックの代入文が1行の場合、省略形でif, else文を書くことができます。

example-06
1a = 4
2if a > 3:
3    a = 3    # 代入文1行
4else:
5    a = 0    # 代入文1行
6print(a)     # a=0

1行でまとめてすっきり書くことができます。

example-07
1a = 2
2a = 3 if a > 4 else 0  # aの値でaを更新する。
3print(a)               # a=0

inとnot in 演算子

リストに要素が含まれるかどうか判定するために、in または not in 演算子 が使えます。

example-07
1v_list = [3, 4, 5, -2]
2print(3 in v_list)  # True
3print(0 in v_list)  # False
4if 3 in v_list:
5    print("3を要素に含む。")
6if 0 not in v_list:
7    print("3を要素を含まない。")

文字列も各文字からなるリストと考えれば、inで特定の文字を含むかどうか判 定できます。

exmaple-8
1s = "千葉大学工学部"
2t = "千葉"
3if t in s:   # s.find(t) != -1 と同じ
4    print("{}{}を含む".format(s, t))

if文の例文まとめ

最後に分岐や論理演算の例文をまとめて示します。

example-08
# 単純分岐の例
a = 3
if a == 3:
    print("aは3")

if a:
    print("aは0でない")

# 2分岐の例
a = 4
if a * 3 == 12:
    print("aは12")
    print("a==12以外の時はelseブロックは実行されない")
else:
    print("aは12ではない時に実行")


# 3分岐の例
a = "hoge"
if a == "huga":
    print("aはhuga")
elif a == "hoge":
    print("aはhugaではなくてhoge")
else:
    print("aはhogeでもhugaでもない")

# 論理演算の例
a = 100
if 10 < a and a <= 200:
    print("aは10より大きくで200以下")

# 短縮形を使う
a = 25
a = 7 if a > 20 else 0
print("aは7にupdateされた")


# inとnot in演算子
string = """
千葉大学工学部総合工学科
共生応用化学コース
2年3組10番 大窪 貴洋
"""
num = "10"
if num in string:
    print("{}{}を含む。".format(string, num))
num = "20"
if num not in string:
    print("{}{}を含まない。".format(string, num))

クイズ

Q1

変数vの値をチェックして、30以上かどうか調べる。30以上ならvの値を表示する。

v = 10     # vの値を自分で変えてチェックする

答え

1v = 30
2if v >= 30:
3    print("{}は30以上".format(v))

Q2

変数vの値をチェックして、30以上で100未満かどうか調べる。30以上で100未 満ならvの値を表示し、違うなら"違う"と表示する。

v = 10     # vの値を自分で変えてチェックする

答え

1v = 30
2if 30 <= v and v < 100:
3    print("{}は30以上で100未満".format(v))
4else:
5    print("違う")

Q3

変数sの値をチェックして、文字数が10文字ならsを表示する。

s = "hogehoge"     # sの値を自分で変えてチェックする

答え

1s = "hogehoge"
2if len(s) == 10:
3    print(s)

Q4

変数sの値をチェックして、文字に"ho"が含まれるかどうか調べる。find()メソッドを使ってください。文字列用のメソッド

s = "hogehoge"     # sの値を自分で変えていろいろ調べる

答え

1s = "hogehoge"
2if s.find("ho") != -1:
3    print("hoが含まれる")
4else:
5    print("hoが含まれない")

Q5

リストの最大値要素が100以上かどうか調べる。100以上なら最大値を表示する。

l = [0.2, 3, 100, 32, 150]

答え

1l = [0.2, 3, 100, 32, 150]
2if max(l) >= 100:
3    print("最大値は", max(l))

Q6

年齢を与えると、以下の料金表にしたがって入場料を表示するプログラムを作る。

年齢

入場料金

6歳以下

100円

7歳以上で20歳未満

入場できない

20歳以上で40歳未満

500円

40歳以上で60歳未満

800円

60歳以上

1000円

答え

 1year = 50   # 適当な年齢を入力する
 2if year <= 6:
 3    print("料金は100円")
 4if 7 <= year and year < 20:
 5    print("入場できない")
 6if 20 <= year and year < 40:
 7    print("料金は500円")
 8if 40 <= year and year < 60:
 9    print("料金は800円")
10if year >= 60:
11    print("料金は1000円")

Q7

与えた整数を以下の条件で判定して、どの条件に合致するか結果を表示させる。

  • 3の倍数であり、7の倍数である。

  • 3の倍数であり、7の倍数でない。

  • 3の倍数でなく、7の倍数である。

  • 3の倍数でなく、7の倍数でもない。

答え

num = 21
if num % 3 == 0 and num % 7 == 0:
    print("{}は、3の倍数であり7の倍数である。".format(num))
if num % 3 == 0 and num % 7 != 0:
    print("{}は、3の倍数であり7の倍数でない。".format(num))
if num % 3 != 0 and num % 7 == 0:
    print("{}は、3の倍数でなく7の倍数である。".format(num))
if num % 3 != 0 and num % 7 != 0:
    print("{}は、3の倍数でなく7の倍数でもない。".format(num))

Q8

共生応用化学コースで筆記試験が免除で大学院に進学できる(推薦入学)条件は以下のとおり。

  • 学籍番号は16Tで始まること。

  • GPの順位が30番以内であること。

  • TOEICの点数が580点以上であること。

  • 140単位以上、取得していること。

以下の辞書データを持つ学生が推薦入学できるかどうか判定するプログラムを作り、その結果を名前付きで表示させる。 繰り返し処理は教えていないので、一人の学生データ毎にifやelseで分岐すれば良いです。

答え

# 学生A
student_a = {}
student_a['名前'] = "千葉太郎"
student_a['GP順位'] = 10
student_a['TOEICのscore'] = 590
student_a['取得単位数'] = 150
student_a['学籍番号'] = "16T9999X"

# 学生B
student_b = {}
student_b['名前'] = "千葉花子"
student_b['GP順位'] = 30
student_b['TOEICのscore'] = 570
student_b['取得単位数'] = 150
student_b['学籍番号'] = "15T9999X"
# 学生A
student_a = {}
student_a['名前'] = "千葉太郎"
student_a['GP順位'] = 10
student_a['TOEICのscore'] = 590
student_a['取得単位数'] = 150
student_a['学籍番号'] = "16T9999X"

# 学生B
student_b = {}
student_b['名前'] = "千葉花子"
student_b['GP順位'] = 30
student_b['TOEICのscore'] = 570
student_b['取得単位数'] = 150
student_b['学籍番号'] = "15T9999X"

s = student_a
if s['学籍番号'][:3] != "16T":
    print("{}の学籍番号が16Tで始まらないのでダメ".format(s['名前']))
    exit()
if s['GP順位'] > 30:
    print("{}のGPが30番以内でないのでダメ".format(s['名前']))
    exit()
if s['TOEICのscore'] < 580:
    print("{}のTOEICの点数が580点未満なのでダメ。".format(s['名前']))
    exit()
if s['取得単位数'] < 140:
    print("{}の140単位以上、取得していないのでダメ".format(s['名前']))
    exit()
print("{}は推薦入学できます。".format(s['名前']))

Q9

if, elif, else, 論理演算子を使ったプログラムを自分で考えて作成する(何でも良いです)。 ツェラーの公式 の実装はどうでしょうか?

床関数はint()を使えば実装できます。

print(int(0.1) # 0
print(int(3.8) # 3

答え

"""
ツェラーの公式の実装
後述するdatetimeモジュールを使えばもっとスマートにかけます。
エラーの判定が甘いです。
(13月-1日でもプログラムが動いてしまうなど)
テスト用データ
<1600-02-03 木>
<2002-06-04 火>
<2019-01-04 金>
"""

date = {}
date['year'] = 2019
date['month'] = 1
date['day'] = 4


# 西暦0年3月1日以前の場合は適応外
if (date['year'] < 4) or\
   (date['year'] == 4 and date['month'] < 3) or\
   (date['year'] == 4 and date['month'] == 3 and date['day'] == 1):
    print("西暦4年3月1日以前の場合は適応外")
    exit()

y = date['year']
m = date['month']
d = date['day']
# 1,2月はy+1年の13,14月とする
if m <= 2:
    y = y - 1
    m = m + 12

C = int(y/100)
Y = y % 100

if 1582 <= y:
    gamma = 5 * C + int(C/4)
elif 5 <= y and y <= 1582:
    gamma = 6 * C + 5
else:
    print("適応外?")
    exit()

h = d + int(26*(m+1)/10) + Y + int(Y/4) + gamma
h = h % 7
youbi = ['土', '日', '月', '火', '水', '木', '金']
s = "{}{}{}日".format(date['year'], date['month'], date['day'])
print("{}{}曜日。".format(s, youbi[h]))