【Python講座4】while,for,if文

前回のPython講座までだいぶ日が経ってしまいましたが、宿題はやってきましたか??前回の宿題は、Pythonで以下の出力をすることでした。

目次

前回の振り返り

これを行う為には、どんなコードを書けばよいでしょうか?ヒントはif文、for文、while文です。これらを組み合わせて行います。

私が考えた答えはこれでした。

これはどういう意味かというと、nが3で割り切れたらFizz、
nが5で割り切れたらBuzz、その他はnそれ自体の数を表示する、という命令です。%は割り算の余りです。
これが0に等しい(==)時、

しかし、こうすると、3で割り切れるときに分岐してしまうので、Fizz Buzzが同時に表示されないという致命的なミスがありました。
if n % 3 == 0:が一番最初に表示されるので、5でわりきれるし、3でもわりきれるとき、3でわりきれたらFizzと表示して命令を終了してしまうので、Buzzが表示されません。

では、どうすればよいでしょうか??

少し考えてみると、3でも5でも割り切れるということは、、15で割り切れるということですよね?

ということは、こう書いてみるといかがでしょうか?

こうすると、上のように表示されますね!

因みに、この問題はFizz Buzz問題といってかなり有名な問題なのだそうです。
プログラマーに紙やホワイトボードに書かせる問題が一時期流行ったそうです。

今回の問題をもし、C言語で書いたらどうなるでしょうか??

このようになります。Pythonの方が簡単に記述出来ますが、C言語の方がより細かいです。

さて、if文についてはもしかするとやっていなかったかも知れませんね。今回はif文、for文を中心に見ていきます。

if文

if文は、条件に合致しているものを実行する条件分岐を作ることが出来ます。if〜の条件が合致せず、実行されなかったら、次の条件に合致する
ものを調べて実行します。

それがelif、elseというものです。

if文を使ったプログラムを見てみましょう。

これはxが0以下の時に、 xに0を代入する命令です。x=-1と代入すると、zero ni shimashitaと表示され、xを調べると値が0と帰ってきます。

ここで、注意点としては、ifで命令が実行された場合は、次のelifの条件は実行されない。ということです。今回の私も

この問題でつっかかってしまいましたね。

x=2>0であるので、elif以降は実行されません。elifはあくまで実行されなかった時の
次の受け皿だからです。上の文は条件分岐の設定がおかしいのでバグになってしまいます。

for文

繰り返し命令を実行する制御フローを作ることが出来ます。

whileよりfor には重複する要素があり、whileもforもあるならforの方がよかったりします。

Pythonのfor文は任意のシーケンス型にわたって反復を行います。
(要は繰り返す条件は同じ種類のデータを元にして下さいということです。)

for文の例を見てみましょう。

a =[](リスト型)…リストは入れ子上に作ることも出来ます。(これは以前やりましたね。)

forの場合は要素が尽きる迄実行を行います。
返された3,6,12という値はlen(x)によって計算された文字列の長さです。
catは3文字、windowは6文字、defenestrateは12文字で構成されます。

また、forの入れ子構造を作ることも出来ます。

ここで、for文を書く際に、どの範囲を選択すればよいでしょうか?例えば、 “hello” のような文字列と、 [1,2,3] のようなリストでも、同じようにfor文の範囲に設定することが出来ます。

例えば、for e in ...: に文字列の場合は一文字ずつ、リストの場合は1要素ずつ、処理ができる。このようにデータ構造(この場合は文字列、リスト)の枠を超えて使い方を揃えることで、プログラマは覚えなければならないことが少なくなるし、文字列で学んだことをリストでも使える、といった利点が出てくるのです。

こうしたデータの型の違いを超えてデータを扱える性質のことを直交性と呼ぶそうです。試験に出るかもしれません。

因みに、inは”入っている”の意です。右側にあるものがあるかどうか調べます。

上の命令のように、aという文字がある文字列の中にあるかどうかを調べたり、内部の要素をeとして、要素を一つずつ読み出す(print)ことも出来ます


ところで、whileやforに近いものとして、Pythonでは、range(nから始まり、m未満(負の値では超過)、lの間隔で繰り返す)という書き方をすることが出来ます。

例えば、range(-1,-10,-2)と記述すると以下のようになります。

同じことをwhileでやろうとすると、

要素かつ番号を取得したい時は、以下のように記述します。

break

さて、if文と関連するものとしてbreakがあります。breakはif文の条件をとめます。if文が成り立ち、breakの中断が
為された場合は、else以下は実行されません。(forやifの命令が成立しない時はelse:)

以下の命令を実行します。

range(2,n)は2以上n未満の意です。

2~9までの情報を取得し、nが2~9までの値のどれかで割り切れる時は
その掛け算を出力します。

いかがだったでしょうか?さて、次回は画像解析に戻ります!