だぶるばいせっぷす 新館

ホワイトカラーではないブルーカラーからの視点

【プログラミング】 python奮闘記 その4 ~条件分枝 if文

前回は、主に代入について書いていきました。
私自身の理解がまだまだのせいか、初歩的な部分しか触れられませんでしたが、変数と代入は頻繁に利用するので、普通に勉強をしていれば触れる機会も増えていくので、今のところは、徐々になれていくしか無いと思っています。
kimniy8.hatenablog.com

という事で、変数はこの辺りにしておいて、次は条件分枝に挑戦していこうと思います。
条件分枝を覚える事で、出来ることが大幅に広がりますし、より、複雑な事をパソコンに命令できるようになります。

ではまず、『条件分枝』とは何なのかという所から説明しましょう。
条件分枝とは、『ある条件』に当てまった場合、先に進むという感じの作業をコンピューターに行わせます。

これを読まれている人達には分かりづらい例になりますが、その昔、『ゲームブック』というジャンルの本がありましたが、それを読み進める作業を自動で行ってくれるのが、『条件分枝』です。
一応、ゲームブックの説明をしておくと、ゲームブックは、最初のページから順番に読み進めていく、所謂『普通の本』とは違います。
ゲームブックは、物語の主人公に自分がなったつもりで読み進めていき、主人公が下す決断は、自分自身で決めていくことになります。

例えば、『貴方は洞窟に入って一本道を道なりに進んでいくと、道が2つに別れていました。 右に進む場合は、20ページへ、 左に進む場合は63ページに飛んでください。』こんな具合に、自分が下す決断によって、次に読むページが指定されていきます。
こんな感じの構成になっている為、普通の小説のように、最初から最後まで読めば、読んだ人が皆、共通の物語を楽しめるといった感じにはならず、読む人間によって、ストーリーが変わります。
当然、選択肢を失敗すればバッドエンドなんてことにもなり、物語が完結しない状態で終わったりもします。

これと同じことを、プログラミングを使って行おうというのが、『条件分枝』です。
条件分枝には、『if』文を使います。

ifは、英語で『もし…』という意味があり、使い方としては、『if』の後に条件を指定して、その条件に当てはまった場合の処理を書きます。
ifを使って書く事で、条件に当てはまった時だけ計算式に誘導し、それ以外の場合は無視するといった事が出来るようになります。
書き方としては

if 条件:
  処理1
  処理2

といった感じで書いていきます。
ifの後にスペースを開けて、条件を書き込んでから、最後に『:』で終わります。
その後、改行してから、どの様な処理をしていくのか書いていくわけですが、ここで注意が必要なのが、『:』を付けた後に改行した際は、半角スペース4つ、または『tab』ボタンを押して、空間を開けなければならないという事。
処理が1つで終わらずに2、3…と続いていく場合は、書き出しは、全部の書き出しの前に空間を開ける必要があります。

空間を開ける意味合いとしては、if文の処理を一纏めにする為です。
普通のプログラムの場合は、1まとまりを{}で括るなどして表現するようですが、pythonでは、空間をあける事でプログラムのまとまりを表現しています。
この一連の行動を『インデント』と呼び、これをしっかりと行っていないと、単にプログラムが見づらいというだけでなく、エラーが出たりしますので、注意しましょう。
『インデント』は、if文だけでなく、この後に説明する『関数』など、他の行動でも頻繁に出てくる為、絶対に覚えておかなくてはならないモノの一つです。

if文の続きを書くと、当てはまった場合は計算式に誘導し、当てはまらなかった場合は、別の行動に誘導するというように、『条件に当てはまる』『条件に当てはまらない』といった条件分枝で、それぞれに別の行動を取らせようと思った場合は、『else』を使います。
書き方は if の時と同じで、最後に『:』を付けて改行し、次の行は処理が終わるまで『インデント』を付けます。

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

ここでの注意は、『else』の書き出しは、if と合わせるということです。
間違って

if 条件:
  処理1
  処理2
  else:
    処理1
    処理2
と書かないようにしましょう。
こう書いてしまうと、『if』で付けた条件を満たさないと『else』が発動しないとい事になってしまい、条件分枝の意味が無くなります。
では、『条件を満たした場合』と『満たさなかった場合』の2つしか道を枝分かれさせることは出来ないのでしょうか。
そんな事はありません。if文には、満たされるべき条件を複数個設定し、それぞれの道に分岐させる為の方法も用意されています。
それが、『else』と『if』を合体させた、『elif』です。書き方も、これまでと同じで

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

とします。『elif』は何個でも好きなだけ追加する事が出来るので、結果として、自分の好きなだけ条件分岐が出来ることになります。
更に、先ほど紹介した『else』を最後に書いてから処理を追加すれば、どの条件にも当てはまらなかった場合の処理も追加することが可能です。
このif文を利用すると、何らかのデータを自動で振り分けるという事が出来たりもするので、応用範囲は非常に広いです。

また、if文で設定する条件ですが、一つの『if』の中に複数個の条件を書くことも可能です。
先ほどから例で書いているので説明すると、『条件1』に複数個の条件を設定できるということです。

それを可能にしてくれるのが、『and』『or』『not』です。 意味は、英単語の意味そのままの意味なので、理解がしやすいと思います。
例を書くと

if a>5 or a<20 and not(a==8):
  処理1
else:
  処理1

って感じで書くと、『a』という変数が5より上か20より下、且つ、7より上で10より下の数字では無いときだけ、if文を実行という事が出来ます。
『and』は両側の条件を両方満たす場合という意味で、『or』はどちらか一方を満たすとき、『not』は、()で括った範囲の条件を反転します。
その為、この例でいうと、aという変数が5より大きい時か、20より小さくて8では無い時にだけ、if文の処理が行われます。

読者の方からご指摘が有って、もう一度見直すと、条件式が間違ってました…
先ほど紹介した場合だと、aが5以上の時か、aが20以下で8以外の時という条件のどちらかを満たせばifが発動するので、結局、全てのケースでifが当てはまってしまい、if文の意味がなくなってしまいます。 自分すら予測してない状態で、『悪い失敗例』を紹介してしまいましたね。
例で『and』『or』『not』の全てを使わなきゃと思って何度も書き直している内に、変な条件式になってしまいました。 まだまだ身についていない証拠ですね。

という事で、改めて条件式の例を書いてみます
if a<2 or 5< a <20 and not(a==8):
  処理1
else:
  処理2

こう書くと、aが2より少ない時か、aが5より大きくて20より小さい時、且つ8以外の時にだけ if が発動し、それ以外は else になるはずです。。

not()内に『or』や『and』を書くと、それの効果も反転するので、注意が必要です。
not(条件A and 条件B)の場合、『条件AとBを両方満たす時』というのが反転し、『条件Aか条件Bを満たさない時』と変化します。
今回例で使った変数aには、単体の数字が含まれているという想定で書いているので、『and』と『or』の違いに然程意味がないような印象を受けるかも知れませんが、扱う変数が複雑なものになった時に、or や and の使い分けが重要になってきそうなので、覚えておくと良いかも知れません。

今回で『インデント』という、段落によって『プログラムを塊ごとにまとめる』という方法を学んだので、次回は、同じく『インデント』を使った関数について書いていきます。