Lesson02 条件分岐

イメージ画像

場合によって処理をわける、条件分岐を学ぼう

  • if を使った条件分岐
    • 条件分岐の if 文
    • ネスト
    • 真偽
    • 条件を並列にならべる and と or

今回は、if 文という条件分岐の機能について学びます。コンピュータを使うということは何かしらの処理をさせるためですが、処理 A の場合は…、B の場合は…、C の場合は…と場合によって処理をわけることがたびたびあります。これを条件分岐といいます。この条件分岐を行う方法を学びます。

今使うソースコードはここからまとめてダウロードできます。 ダウンロードfile_download

前回の復習

前回は変数に値をセットすること、print 関数と input 関数の使い方を学びました。また、関数全般で使う引数や戻り値といった用語も教わりました。

前回出た重要キーワード

  • 引数
  • 戻り値、返り値
  • 関数
  • 予約語
  • 変数にデータをセットする方法を学びました。変数を左辺に、=記号を挟んで右辺にセットするデータを置きます。
  • 変数の名前は自由につけてもいいのですが、使えない文字や、そもそもつけられない名前(予約語)があることを学びました。
  • 関数は、何かを入れると加工して出してくれる万能データ加工機のようなものです。入れるものを引数といい、加工されて出てくるものを戻り値と言いました。

復習として、高さと底辺の長さから三角形の面積を求めるプログラムを書いてみましょう。ただし、高さも底辺も整数とします。

ソース(fukusyu02.py)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
print("このプログラムは高さと底辺の長さから三角形の面積を計算します。")

print("高さを整数で入力してください") # takasa , menseki , teihen 
#キーボードから高さを受け取り、takasaという変数にセットします。
takasa = input()
# キーボードからの入力は文字列なので、整数に型を変換します。
takasa = int(takasa)

print("底辺の長さを整数で入力してください")
#キーボードから底辺を受け取り、teihenという変数にセットします。
teihen = input()
# キーボードからの入力は文字列なので、整数に型を変換します。
teihen = int( teihen )

menseki = takasa * teihen * 0.5 #面積という変数を用意します。
menseki = str(menseki)
print("この三角形の面積は"+ menseki + "です")

ポイント

input() という関数は次のようにして、変数にキーボードから入力された文字列をセットします。
ただし、このinput()でセットされた変数は「文字列」型です
変数名 = input()
あるいは
変数名 = input(“入力を促すメッセージ”)

1if 文を使った条件分岐

この章のキーワード

  • if 文
  • if else 節
  • ネスト、入れ子
  • 真偽とは
  • and 、or
  • インデント、字下げ

1.1 条件分岐の if 文

つぎのような金額の計算プログラムを考えましょう。

「ある EC サイトでは送料は一律 500 円です。ただし、税込み金額 2000 円以上購入した場合は送料は無料になります。送料には消費税はかからないものとします。
これを購入した金額を kakaku , 送料込みの請求金額を seikyu としてコンピュータに計算させてみましょう。」

このとき、ある条件で処理を変える、if 文とよばれる方法を使います。

ある条件に合致するかしないかの if 文の使い方

if 条件 : 
        その条件の時の処理
else : 
	その条件にあてまはまらない処理

ソース(if01.py)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
print(“購入した商品の税込み総額を入れてください”)
kakaku = input(“”) #
kakaku = int(kakaku) #
if kakaku < 2000 : #
    seikyu = 500 + kakaku #
else : 
    seikyu = 0 + kakaku #
seikyu = str(seikyu) #文字列に変更した
print(“送料込みの請求金額は”)
print(seikyu) #
print(“です”)

択一な条件をどんどん追加していくこともできます。

条件をどんどん追加する if 文の使い方

if 条件 : 
	その条件の時の処理
elif 条件2 :
 	その条件2の時の処理
elif 条件3 : 
	その条件3の時の処理
・
・
・
else : 
	上のどの条件にもあてまはまらない処理

条件はこの中の1つだけが処理されます。if , elif … の中のどれかの条件に一致したらすぐに if 文を抜けて次の処理に移ります。
なお else はなくてもかまいません。

コロン
if 文では条件やelseなどのあとに必ずコロンという記号(:)を入れてから改行をします。コロンを入れて初めてif文として認識するため、入れないで実行するとシンタックスエラーになります。
インデント
if 文では、条件にあった処理を if , elif , else の後に書きますが、そのときに必ずインデントをおこないます。インデントするには、先頭でTABキーを押します。
インデントは字下げともいいます。インデントされていないと python はシンタックスエラーになります。

実際にやってみましょう。

1.2 ネスト(入れ子)

箱の中に箱を入れたような構造を ネスト あるいは 入れ子 といいます。
皆さんは、マトリョーシカという人形を知っていますか。大きい人形の中に人形があり、それをさらにあけるとまた人形があり・・・となっているロシアの人形です。これと同じような構造を ネスト といいます。if 文はネストできます。

マトリョーシカ
マトリョーシカのようなネスト  出典:Wikipedia『マトリョーシカ人形』

次の例をみてみましょう。これは複数の条件が並んでいるのでなく、ある条件のなかでさらに条件が分岐するような場合です。

「ある EC サイトでは送料は一律 500 円です。ただし、税込み金額 2000 円以上購入した場合は送料は無料になります。また、5000 円以上購入してくれた場合は送料込みの金額から15 %オフになります。(送料には消費税はかからないものとします。)」

ソース(if02.py)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
print("購入した商品の税込み総額を入れてください")
kakaku = input("")
kakaku = int(kakaku)
if kakaku <2000 : 
    seikyu = 500 + kakaku
else : 
    seikyu = kakaku
    if seikyu <= 4999 :
        seikyu = kakaku
    else :
        seikyu = kakaku * 0.85
    

print(“送料込みの請求金額は”)
print(str(seikyu))
print(“です)

1.3 真偽

よくプログラミングの参考書では、if のあとの条件は 真のときに実行されて、偽のときにスキップされるということが書かれています。
先に示した次のコードをみてみましょう。input 関数を使っているので kakaku にはどんな数字がはいってくるのかわかりません。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
print(“購入した商品の税込み総額を入れてください”)
kakaku = input(“”)
kakaku = int(kakaku)
if kakaku <2000 : 
	seikyu = 500 + kakaku
else : 
	seikyu = kakaku

print(“送料込みの請求金額は”)
print(str(seikyu))
print(“です)

真とは正しく成り立つときで、偽はそうでないときと覚えても今は差し支えありませんが、もう少しだけ突っ込んでおぼえましょう。

  • 数字の 0 は偽です。0 以外の数字は真です。
  • 文字数が 0 の文字列は偽です。
  • 文字数が 0 でない長さのある文字は全て真です。

とくに数字の 0 が偽というのは感覚的に納得できないかもしれません。これはもともとコンピュータの基礎となるブール代数という数学の分野が 0 と 1 を扱ったからなのです。ですから、次のコードは else 側の処理は実行されません。

if 1 : 
	#この行は絶対に実行される
else : 
	# この行は絶対に実行されない

何の役に立つかは今はわからないと思いますが、少し頭の隅においておいてください。

1.4 条件を並列にならべる and とor

条件 A と B が両方ともそろったときに 処理 α が実行され、それ以外で処理 β が実行されるような場合を考えましょう。

条件と両方そろったときに使う and

if  条件Aと条件Bがともにそろったとき : 
	処理 α が実行
else : 
	処理 β が実行

例:変数 num に代入された整数が 15 の倍数のときに「15 の倍数です」、3 の倍数ではあるが 5 の倍数ではないときは「 3 の倍数です」と表示する時

ソース(and.py)

 1
 2
 3
 4
 5
 6
if num % 3 == 0 and num % 5 ==0 : 
	print(“15の倍数です”)
elif num % 3 == 0 :
          print(“3の倍数です”)
else : 
	print(“3の倍数ではありません。”)

この if 文は、条件 A の時 and 条件 B の時 というふうに and という語を挟みます。

また、条件 A と条件 B の少なくとも片方がそろったときに条件にあうという場合は条件 A の時 or 条件 B の時 というふうに or という語を挟みます。

上のコードで and を or に変更したコードをみてみましょう。

 1
 2
 3
 4
 5
 6
f num % 3 == 0 or num % 5 ==0 : 
	print(“3あるいは5の倍数です”)
elif num % 3 == 0 :
          print(“3の倍数です”)
else : 
	print(“3の倍数でも5の倍数でもありません。”)

場合によっては、andとorを使ってもよいですし、ネストにして書けることもあります。

 1
 2
 3
 4
 5
 6
 7
if num % 3 == 0 : 
          if num % 5 == 0 :
                  print(“15の倍数です”)
         else : 
                 print(“3の倍数です”)
else : 
	print(“3の倍数でも5の倍数でもありません。”)

インデントについて

インデントって何?

インデントが、処理の順番や影響範囲を決める

インデントの図解1

インデントを一つずらすと…

インデントの図解2

演習の時間

演習の解答はここからダウンロードできます。ダウンロードfile_download

演習1

太郎君は、ある会社でプログラマーとして働いているとします。先輩から、ある通信販販売のキャンペーン期間中のお金の計算をする部分の部品を作ってほしいと頼まれました。
キャンペーン期間中の代金の請求方法は次のようになります。

  1. カートの中に入っている総額は税抜き金額で表示されています。
  2. 送料は一律 500 円です。送料には消費税はかかりません。
  3. カートに入っている税抜き金額の総額が 2000 円以上の場合、送料は 0 円になります。
  4. 消費税は一律 10 %とします。
  5. 小数点以下の金額は切り捨てです。

例えば税抜 1500 円分の商品を購入した場合、1500 * 1.1 + 500 = 2150 が請求金額になります

期待される動作(青い色の文字はキーボードからユーザが入れた数字の一例です)

税抜き金額の総額を入力してください
1500
送料と消費税を入れたご請求金額は、次の通りです。
2150円
をご請求します。

太郎君は、まずカートに入ってくる金額をまず input() 関数で自分で入れて、最終的に請求する消費税込の金額を計算する次のようなプログラムを作ってみました。
100 や 1000 や 3000 など様々な値を入れて、たしかに動くことを確認して太郎君は満足しました。

太郎君が書いた python のソースコードは以下のとおりです。プログラムの中の????を埋めてみましょう。
(ensyu01.pyの名前で保存してください。)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
print("税抜き金額の総額を入力してください")
zeinuki = input()
zeinuki = int(zeinuki)

if ???? :
	seikyu = ???? 
???? : 
	seikyu = zeinuki * 1.1

seikyu = ???? # int型にして小数点以下を切り捨てます。
seikyu = ???? #「をご請求します」の文字と連結するために文字列型にします。

print("送料と消費税を入れたご請求金額は、次の通りです。")
print(seikyu + "をご請求します。")

時間があまったあなたに

ド・モルガンの法則

条件 A が成り立つことを単に A と書くことにします。同様に条件 B が成り立つことも単にB と書くことにします。
A と B が同時になりたつことを A and B と書くことにします。

また、A が成り立たないことを A 、B が成り立たないことを B とかくことにします。つまり下線を引くと、上線の上の条件がなりたたないという条件になるわけです。
このとき、A と B が同時には成り立たないという条件はこの上線をつかった表記だと
A and B となります。

A and B は A or B と同じです。これをド・モルガンの法則といいます。

ド・モルガンの法則

条件 A と条件 B がある。条件 A がなりたたないことを A ,B がなりたたないことを B と表示する。つまり上線をひいたらその条件をまるごと成り立たないとする。
A and B は A or B と同じである。
A or B は A and B と同じである。

「『ある変数が 3 の倍数であり、かつ 5 の倍数である』という条件が成り立たない」という条件(条件 C )を考えてみましょう。
A: 3 の倍数である
B: 5 の倍数である
とすると、条件Cは、A and B です。先ほどの定理を使うとこれは A or B です。
これは
「『ある変数が 3 の倍数でない』、あるいは『 5 の倍数でない』」
と同じことです。納得できますか?

「『ある変数が 3 の倍数であり、かつ 5 の倍数である』という条件が成り立たない」
はその変数が 15 の倍数ではないということです。これは「 3 の倍数でない」か「 5 の倍数でない」か「 3 の倍数でも 5 の倍数でもない」ということになります。or という記号はA, B少なくともどちらか一方がなりたつという意味なので、
「『ある変数が 3 の倍数でない』、あるいは『 5 の倍数でない』」
となります。たしかにド・モルガンの法則の結果と同じですね。

これを使ってソースコードを複雑な条件から簡単な条件に書き換えることがよくあります。

もう少し時間がある人は、「『ある変数numが 3 の倍数か 5 の倍数である』が成り立たない」を if 文のコードにかいてみましょう。

下の演習はLesson04で習う”モジュール”というものを使っていますが、それ以外の部分は今回習った if 文で書くことができます。時間がある人は挑戦してみましょう。

演習A

下記のようなような動作をするおみくじプログラムを作ります。このプログラムは、Enterを押すと、ランダムに次の4つのメッセージを表示します。
「やったね!大吉です!」
「なかなかいいよ。中吉です」
「いいよ、吉です。」
「がーん、凶です…明日があるさ」

期待される動作

Enterを教えてください
Enterを押す
やったね!大吉です!

ランダムに変数 moji に数字がセットされるサンプルコードは以下の通りです。
例えば変数を kuji とすると、kuji は実行するたびに 0 か 1 か 2 か 3 になります。

 1
 2
 3
import random
kuji = random.randint(0,3)
print(kuji)

これをつかっておみくじを作ってみましょう。
(ensyuA.pyの名前で保存してください。)

演習B

演習Aで作ったおみじくプログラムは、4つのメッセージがほぼ等確率で現れます。しかしそれではおみくじらしくありません。そこで、大吉は約 10 %の確率で、中吉は 35 %の確率で、吉は 50 %の確率で、凶は 5 % の確率で表示されるように改良を加えてください。
(ensyuB.pyの名前で保存してください。)

ヒント

出てくる乱数を 1 から 100 の範囲に設定し、その数字を大小比較します。

大人のあなたへ

プログラミングと集合論、論理学

「時間があまったあなたに」でとりあげたド・モルガンの法則は、高校の数学の教科書でみたことがあるかもしれません。条件 A や条件 B はある条件をみたしたデータと考えることができ、集合と考えることができます。ベン図でかんがえてみましょう。
and は数学の記号で∩、or は ∪で表し、条件が成り立たないという記号は下線でなく上に線を引きます。


A or Bは色のついたところを表している。


A or Bは上の図で色がついていない白い個所を表している。この2つの図の色のついているところは共通がない、補集合の関係。

A or B は A and B と同じであることはベン図をじっくり眺めるとわかります。下のABの図を重ねて、共通で白い部分を見てみましょう。これは、一番下の図の白い部分と同じです。


ABで白い色になっているところに注目する

ベン図を描くと、たしかにこの 2 つは同じものであることがわかります。プログラミングにおいて集合を考えると複雑なコードが等価なもう少し簡単なコードになることがあります。プログラミングを仕事にしていると、集合や論理学が深くプログラミングの理論の土台にあって、直接仕事に役に立つという場面にしばしば遭遇します。