Be a Pythonista ! その4 条件分岐①

最初に…

今回は「条件分岐(if)」について書きます。
条件分岐が書ければ、変数と組み合わせて簡単な処理を実装できます。
良し悪しは置いといて、動けばOK程度なら変数+条件分岐だけでなんでも
書けるんじゃないですかね? しらんけど(関西人)

今回も前後編に分けようと思います。
前半の今回は条件分岐の基本的な書き方をやり、
後半は条件分岐の「条件」について少し詳しく書きます。


目次



前の記事

良ければひとつ前の記事もどうぞ!


条件分岐なんて名前が大げさすぎる

条件分岐って名前がもう大げさでびっくりしますよね。
でも、Pythonの条件分岐の根本を示すのに必要な文章量は、
コード1行と日本語2行のたった3行です。
大したことじゃありません!


結局、条件分岐は何をしてるの?

三行解説!

if 〇〇:
    なにかしら処理

上記の「〇〇」の部分が、「True」なのか「False」なのかしか見てません。


正直、根本の部分はマジでこれだけなんです

この三行解説、さすがに手抜きだろ!」と思うかもしれません。
でも、本当にPythonの条件分岐はマジでこれしか見てないんです!

具体的な書き方やお作法みたいなものはありますが、
三行解説を頭に叩き込んだら条件分岐の基本的な使い方はマスターしたと
言っても過言じゃありません!ヤッタネ!


具体的なコードを書く前に・・・

条件分岐の具体的な話をする前に必要な知識が一つあります。
それは、「比較演算子」です!
これまた大げさな名前ですが、二つの値を見比べるってだけです。
しかも、大まかに分けると以下の三つしかありません!

  • 等しいか、異なるか

  • 大きいか、小さいか

  • 含むか、含まないか

個別に解説しましょう。


等しいか、異なるか

二つの値が等しいかどうかを見比べるときの記号です。

  • 「x == y」 xとyは等しいですか?

  • 「x != y」 xとyは異なりますか?

二つの値(上記だとxとy)の間に
==」 や 「!=
を入れることで、二つの値が等しいかどうかを確認できます。

確認した結果、「比較演算子」と「二つの値の関係」が
正しければ「True
間違っていれば「False
が返ってきます。
これはほかの比較演算子でも同じで、「True」か「False」が返ります。

コードで見てみましょう。

x = 747
y = 747
z = 741000

print(x == y)  # xとyは等しいので、True
print(x == z)  # xとzは異なるので、False
print(x != y)  # xとyは等しいので、False
print(x != z)  # xとzは異なるので、True

となります。


大きいか、小さいか

二つの値の大小関係を見比べるときの記号です。

  • 「x < y」 xはy未満ですか?

  • 「x > y」 xはyより大きいですか?

  • 「x <= y」 xはy以下ですか?

  • 「x >= y」 xはy以上ですか?

使い方は「==」と同じです。
以下」や「未満」の使い分けは意識しないと、境界値で
意図しない処理(誤動作)の原因になるので、注意しましょう!

コードは以下の通り。

x = 747
y = 747
z = 74100

print(x < y)  # xはy未満ではないので、False
print(x < z) # xはz未満なので、True

print(x > y)  # xはyより大きくないので、False
print(x > z)  # xはzより大きくないので、False

print(x <= y)  # xはy以下なので、True
print(x <= z)  # xはz以下なので、True

print(x >= y)  # xはy以上なので、True
print(x >= z)  # xはz以上ではないので、False


含むか、含まないか

ある値をある値が含むかどうかを見比べるときの書き方です。

  • 「x in y」 yにxは「含まれている」か?

  • 「x not in y」 yにxは「含まれていない」か?

これは少しややこしいかもしれませんが、
in」は「含まれていることを確認」する書き方です。
not in」は「含まれていないことを確認」する書き方です。

not in」は解釈が反転するので頭がこんがらがるかもしれません。
落ち着いて、ゆっくり考えて解釈しましょう!

コードを見てゆっくり考えてみてください。

x = 747
y = [1, 2, 3, 4, 5]

print(x in y) # yの要素にxは存在しないので、False
print(x not in y)  # yの要素にxは存在しないので、True

y = [1, 2, 3, 4, 5, 747]  # xを含ませた値をyに再代入

print(x in y)  # yの要素にxが存在するので、True
print(x not in y)  # yの要素にxが存在するので、False


具体的にコードを書いて慣れよう!

nは…偶数?奇数?

まずはある数nが偶数か奇数かを判定してみましょう。

n = 747

if n % 2 == 0:
    print('ぐうすう')
elif n % 2 == 1:
    print('きすう')
else:
    print('おめぇなにもんだ?')

上記はn(今回は747)を判定するコードです。
nを2で割った際の余りが0ならば偶数、1ならば奇数としています。
どちらでもなかった場合、「おめぇなにもんだ?」と出力します。

いきなり三行解説で出てこなかったif文の書き方が出てきましたね!
ちゃんと説明するので安心してください。


if文の書き方(その1)

まずは、初歩から。

n = 747

if n % 2 == 0:
    print('ぐうすう')

上記は、nが偶数の時だけ「ぐうすう」と出力してくれます。
if文の条件の後ろには必ず「:」を忘れずつけましょう!

三行解説でも書いた通り、「n % 2 == 0」の部分が「True」か「False
となればif文は正常に動作します。
また、比較演算子解説でも書いた通り、
x == y」は「True」か「False」を返します。
今回のコードだと、xの部分に計算式が直接記述されているだけで、
中身としては何も変わっていません。

ためしに以下のコードを実行してみましょう。

n = 747
print(n % 2 == 0)

出力は以下のようになるはずです。

False

以下のように書き直すと比較演算子解説で書いた形と同じになります。

n = 747
x = n % 2  # nを2で割ったあまりがxに代入される
print(x == 0)  # 見た目は「x == y」になっている!

つまり、「n % 2 == 0」は比較演算子で言及した形に見えませんが、
実態としては何も変わっていないのです。
慣れるまでは変数を使って「x == y」の形に変形してから条件にするのも
いいかもしれませんね!


if文の書き方(その2)

if文で分岐させる条件を増やしてみましょう!

n = 747

if n % 2 == 0:
    print('ぐうすう')
elif n % 2 == 1:
    print('きすう')

上記で新しく出てきた
elif ○○:
は、一番最初に書く「if ○○:」以外の条件で分岐させることができます。
この「elif」は何度でも書き加えることができます。

例えば、以下のように複数の「elif」が使えます。

n = 74100

if 10000 <= n:
    print('nは5ケタ')
elif 1000 <= n:
    print('nは4ケタ')
elif 100 <= n:
    print('nは3ケタ')
elif 10 <= n:
    print('nは2ケタ')
elif 0 <= n:
    print('nは1ケタ')

例とはいえ、なかなかのクソコードの完成です笑

上記のコードだと、nが0 ~ 99999の範囲ならnのケタ数を出力できます。
このように、「elif」を用いて条件を設定し、制御することが可能です。

ただし、複数条件で分岐を行う際は条件の境界と順番に気をつけましょう。

具体的には以下のようなコードです。

  • 条件の境界

# 境界
n = 741000

if 9999 < n:
    print('nは5ケタ')
elif 999 < n:
    print('nは4ケタ')
elif 99 < n:
    print('nは3ケタ')
elif 9 < n:
    print('nは2ケタ')
elif -1 < n:
    print('nは1ケタ')

上記の出力結果は先ほどの条件設定と何も変わりませんが、
条件に使用される値が「9999」等になったりすると条件が見にくくなったり、その結果条件を間違って設定する可能性も高まります。

当然ですが、条件の設定が間違っていれば誤動作の原因となります
if文の条件は、「以上」や「未満」の使い方に気を使い、
正しい条件、正しい境界を設定できているか確認しましょう!


  • 条件の順番

# 順番
n = 741000

if -1 < n:
    print('nは1ケタ')
elif 9 < n:
    print('nは2ケタ')
elif 99 < n:
    print('nは3ケタ')
elif 999 < n:
    print('nは4ケタ')
elif 9999 < n:
    print('nは5ケタ')

一見問題なく分岐しそうに見えるif文ですが、
上記のような順番で条件を設定してしまうと、誤動作を起こします。

なぜかというと、Pythonは条件を上から順番にチェックし、
最初に条件がTrueとなった分岐に入って処理を進めるからです。

つまり、今回のnの範囲は0 ~ 99999を想定していますが、
この条件なら、nが0以上のどのような値であっても一番最初の条件
-1 < n
でTrueとなってしまうため、すべて最初の条件分岐につかまってしまい、
常に「nは1ケタ」という出力を実行する誤動作を引き起こします。
複数の条件を設定する際は、その順番にも気を使いましょう!


余談ですが・・・
数値のケタ数を知りたければ以下のようなコードをオススメします。

n = 741000
print(len(str(abs(n))))

上記は、「nの絶対値を文字列に変換し、文字数を見る」という処理です。
こちらはケタ数や正負に依存せず、シンプルなので楽でいいですよね!


ifの書き方(その3)

どの条件にも当てはまらない場合の処理も書きたいですよね!

n = 747
if n % 2 == 0:
    print('ぐうすう')
elif n % 2 == 1:
    print('きすう')
else:
    print('おめぇなにもんだ?')

また新しい仲間が増えましたね!
今度は「else:」が増えました。

この「else」をつかうと、if と elif の条件で一つもTrueとならなかった場合に実行される処理を記述できます。

上記のコードだと、一見するとelseに到達するように見えませんが、
nに小数などが入った場合は、nを2で割ってもあまりが0でも1でもない値を取る可能性があります。
そういった場合にelseの処理に入り、「おめぇなにもんだ?」と出力してくれるのです。

もし事前にnが整数であることを確約できるのであれば、以下のような条件で判定することもできます。

if n % 2 == 0:
    print('ぐうすう')
else:
    print('きすう')

nが必ず整数なら、2で割れば余りは必ず0か1の二つしか取らないので、
あまりが0」と「それ以外」のような条件設定で問題ないのです。


前半おわり!

基本的なif文の使い方はこれで押さえることができてると思います。
次回の記事は「条件」の部分をもう少し掘り下げる予定です!

何かあればげるすらでもよければわかる範囲で答えますので、
気軽に聞いていただければと思います。

ゆるふぁいですよ~!


次の記事(予定)

アップしたらここにリンク貼りますね!

この記事が気に入ったらサポートをしてみませんか?