空飛ぶチンアナゴの統計解析日記

統計解析を嗜むチンアナゴのメモ帳です

本当に初心者が学んでほしいコードの話 〜その1 コントロールフロー基本編1〜

とりあえずpython準拠でいきます。
STATAやSQL、ほかはとりあえず置いておいきます。

とりあえず

  • if / elif / else
  • forループ
  • whileループ

の3つの基本的な点についておさらいしていきますが、書いてみて思ったり長くなったので、前編は「if / elif / else」、中編は「forループ / whileループ」、後編は「データ解析で使う実践編」の3部構成でやりたいと思います。

if / elif / else

条件を指定して、その条件を満たした時に何かをさせたい時に使うものです。

import random

# 6面体のサイコロな
d6 = random.randint(1, 6)

if d6 % 2 == 0:
   print('偶数')

というコードを例に説明します。
コードの意味としては「6面体のサイコロを振ります。出目(d6)が偶数が出た場合、’偶数’と画面に表示する」となるわけですが、コードの中の「if d6 % 2 ==0:」というところが「出目が偶数が出た場合、」に相当します。
サイコロの出目が偶数だった場合のみ「print('偶数')」という処理をします。

では、「出目(d6)が偶数が出た場合、’偶数’と画面に表示する」という処理に加え「出目(d6)が偶数が出た場合、’偶数’と画面に表示する」という処理を追加したい場合、

import random

# 6面体のサイコロな
d6 = random.randint(1, 6)

if d6 % 2 == 0:
   print('偶数')

if d6 % 2 == 1:
   print('奇数')

と書くことができます。
この場合、サイコロの出目が偶数であれば'偶数'と表示する一方で、出目が偶数であっても「奇数であれば'奇数'と表示する」という条件のチェックを行ってしまいます。サイコロの出目が偶数であれば奇数であるはずはないので、このチェックは本来は必要はないものです。
こういう時には「else:」を使うとよりスッキリします。

import random

# 6面体のサイコロな
d6 = random.randint(1, 6)

if d6 % 2 == 0:
   print('偶数')

else:
   print('奇数')

「else:」は「else:」より前に出された条件以外の条件をざっくりまとめて処理したい時に使うと良いでしょう。

f:id:flying-spotted-garden-eel:20210517194546p:plain
ifとelseの関係

さて、さらに条件を追加します。
「サイコロの出目が3の倍数の時、'さぁーん!'と表示」します。
いわゆる3の倍数になると阿呆になるというやつです。
条件が3つ以上に分岐する場合、2つ目以降の選択肢には「elif」を使います。
では、elifを使って3の倍数になると阿呆になるよう出力してみましょう。

import random

# 6面体のサイコロな
d6 = random.randint(1, 6)

if d6 % 2 == 0:
   print('偶数')

# 3の倍数になると阿呆になる
elif d6 % 3 == 0:
   print('さぁーん!')

else:
   print('奇数')

サイコロの出目が6の時どう表示されるでしょうか?
このコードだと、'偶数'と表示されるはずです。阿呆にはなりません。
この理由としては以下の図の通りです。

f:id:flying-spotted-garden-eel:20210517195754p:plain
ifとelifとelseの関係

ifの条件とelifの条件を同時に満たす場合(青と黄色が重なっているところ)、プログラム上では先にあるものを優先して処理を行います。
ですので先に条件Aを満たしてしまった場合、条件Aに対する処理のみが実行され条件Bに対する処理は行われずにプログラムは終了します。
ですので、阿呆になることを優先して表示せる場合には

import random

# 6面体のサイコロな
d6 = random.randint(1, 6)

# 3の倍数になると阿呆になる
if d6 % 3 == 0:
   print('さぁーん!')

elif d6 % 2 == 0:
   print('偶数')

else:
   print('奇数')

としてあげることで、3が出ても6が出てもちゃんと阿呆になります。
ちなみに

import random

# 6面体のサイコロな
d6 = random.randint(1, 6)

# 3の倍数になると阿呆になる
if d6 % 3 == 0:
   print('さぁーん!')

if d6 % 2 == 0:
   print('偶数')

if d6 % 2 == 1:
   print('奇数')

とした場合、
f:id:flying-spotted-garden-eel:20210517194546p:plain
を3回やるということですので*1
出目が6の場合、

さぁーん!
偶数
奇数

と画面に表示されるはずです。

今日のまとめ

f:id:flying-spotted-garden-eel:20210517195754p:plain

・ifをもちいることで、条件をして処理を行うことができる
・elif / elseをもちいることでifの条件を分岐させることができる
・if / elif / elseのいずれの条件も満たす時は、コードの最初に書いてあるものを優先する

以上です。

*1:この場合、elseでする処理はないので、elseの場合特に何も起こらない