IT・技術研修ならCTC教育サービス

サイト内検索 企業情報 サイトマップ

研修コース検索

コラム

ゼロから歩くPythonの道

CTC 教育サービス

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  Microsoft Azure  Docker  Kubernetes 

第10回 繰り返す方法を学んでみた ~ while構文編 ~ (菱沼佑香) 2020年8月

吉政創成 アシスタントの菱沼です。
今回も「いちばんやさしいPython入門教室(大澤 文孝氏著) 」を片手に勉強していきます。

さて、前回に引き続き、今回も繰り返しの方法について学んでいきます。
Pythonで繰り返すにはfor構文とwhile構文を使う2通りの方法があります。前回の記事ではfor構文と関連するrange関数、ついでにインデントについてまとめました。
今回はwhile構文について学習します。学習中に関係していた比較演算子と代入演算子のリストも記載しました。お役に立てたら幸いです。

while構文の正体と使い方

正体も何も繰り返しのための文ですが何か問題でも?って言われそうですが、今回取り上げるwhile構文は、for構文とはどう違うのでしょうか?

-----引用-----
P.94
前Lessonでは、指定した回数だけを繰り返すための構文として、for構文を紹介しました。しかしときには、指定した回数だけを繰り返すのではなくて、特定の条件が成り立っている間は、ずっと繰り返したいこともあります。そのようなときにはwhile構文を使います。

P.95
書式:while構文
>>>while 条件式:
>>> 条件式が成り立っている場合に実行したい文
(中略)
while total <=50:

この「total <=50」が条件式です。(中略)つまり、total(総計)が50以下であるなら、ずっと繰り返すという意味です。
----------------

for文は【for [変数] in [値]】で、もし条件を付けくわえたいならif文を使うことになるのだと思いますが、それに対して、while文はそれだけでも条件式を設定することが可能なようです。

さてここで、サンプルコードを開いてみました。(次の画像)

fig01

それぞれの行の意味は右側に追記した通りです。これを動かすと、結果は「55」と出ます。
ん?45(aが9になった時点での総計)じゃなくて、55?なぜ?と思ったら、

-----引用-----
P.95
条件式が成り立っている間は、ずっと処理が実行されます。条件が成り立っていることを「真」や「True」、成り立っていないことを「偽」や「False」と言います。
(中略)
つまり、total(総計)が50以下であるならずっと繰り返すという意味です。
----------------

というわけで、<総計が50に到達する直前の計算結果を表示する>のではなく、<総計が50以下なら計算を続行して、超えた時点の結果を表示する>という意味だったようです。
なので、aに9の値が入った時点の総計(total)は45なので、whileの条件(total<=50)に到達していないため、計算が続行されました。次のa=10になった時点で、総計が55になったため、条件に到達したとして、結果が55と表示されたということになります。ほー。

ところで、for文でやった指定された回数を繰り返す方法はwhileでもできるようです。

fig02

上がfor文、下がwhile文です。
たしかにできなかないけど、ただ繰り返したいだけなら簡単なのはfor文ですねえ。
どちらを使えばいいのか悩んだら、繰り返す回数がわかっていたらfor文、繰り返す回数がわからなかったらwhile文と考えておけばいいようです。

比較演算子と代入演算子の覚え書き

さて、whileの条件を指定する箇所で利用された「<=」ですが、Pythonで使える比較演算子についてもテキストで書かれていました。テキストで書かれていた以外の表現もあるようなので、合わせて書いてみます。

比較演算子

演算子

意味

備考

a < b

aはbより小さい

 

a <= b

aはb以下

 

a > b

aはbより大きい

 

a >= b

aはb以上

 

a == b

aとbは等しい

他:a is b

a != b

aとbは等しくない

他:a is not b

a in b

aはbに含まれる

abともに文字列か、bがリストやタプル

a not in b

aはbに含まれない

abともに文字列か、bがリストやタプル

ところで、先の画像で、変数aに1を足し、足した値をaにするという式を「a = a+1」として記述されていました。これは別の表現方法もあるようで、試しにやってみようということで、元のサンプルコードの下に一部分を修正して追加しました。

fig03

画像内の赤枠で囲ったところがその該当部分になります。そして、右側の画面がその結果です。
結果の1行目が上のコードの結果、2行目が下のコードの結果で、同じ値になっていることが確認できました。

この2つ目のコードで書いた「a+=1」の「+=」は代入演算子だということです。ついでなので、Pythonで使える代入演算子についても書いておきます。

代入演算子

意味

演算子に対する補足

a = b

aにbを代入する

 

a += b

a = a + b

足し算

a -= b

a = a - b

引き算

a *= b

a = a * b

掛け算

a /= b

a = a / b

割り算

a %= b

a = a % b

a を b で割った余り

a **= b

a = a ** b

a の b 乗

a //= b

a = a // b

割った後の小数点以下を切捨て

a &= b

a = a & b

ビット演算)論理積(AND)

a |= b

a = a | b

ビット演算)論理和(OR)

a ^= b

a = a ^ b

ビット演算)排他的論理和(XOR)

a <<= b

a = a<<b

ビット演算)bビット左シフト

a>>=  b

a = a >> b

ビット演算)bビット右シフト

~a

 

ビット演算)ビット反転

ところで、ビットについてテキストでは特に説明はありませんが、ある程度理解しておいたほうが良いのかなーと思ってビットについても改めて調べてみました。ビットはコンピュータが処理するデータの最小単位のことで、0と1で表現されるもののようです。テキストの最初のほうで出てきたマシン語のことですね。つまり、コンピュータとおしゃべりするために、コンピュータが理解できる言葉に変えてあげる必要がある、ということのようです。コンピュータが理解できるのは数字で、かつ0と1。プログラムは便宜上、言葉に近い形で書かれていますが、アレは最終的には数字(マシン語)に変換されます。10進数や16進数で表現されることもありますが、コンピュータが理解できるよう2進数に置き換えてあげる必要がある、という理解になりました。(例:5=101、10=1010、11=1011)
ビットについて知りたい方はこちらのページがイメージつけやすいかと。また、ビット演算子の使い方例はこちらをご参照ください。ビット演算子を使うシーンがいまひとつイメージできませんでしたが、時間を見つけて考えてみたいと思います。

whileはウッカリすると無限ループ地獄におちいる。

テキストでは次のように書かれています。

-----引用-----
while構文はその条件が成り立っている間、実行されると説明しました。しかしときには、「永遠に繰り返したい」という場合があります。そのようなときには、以下のように「True」を条件式として指定して記述します。
>>> while True:
>>> 実行したい文
(中略)
Whileの条件式にTrueを指定しておくと、いかなるときでも条件が成り立つことになります。ゆえに、終了する機会がなく、永遠に繰り返します。
「ずっと動きっぱなしになった状態を止めたいとき」は、Ctrl+c(MacはControl+c)を押して、処理を強制的に終了してください。
(中略)余り使い道がないと思われるかもしれませんが、次のLessonで説明するように、実は「条件が成り立った時に、繰り返し処理をやめる」ことができるため、(中略)「何か事が起きるまで待つ」という場面でしばしば使われます。
----------------

役に立つシーンがあるのは理解しつつ、ちょっとぞわっとしてしまいました。だって、うっかり何らかの条件を設定し忘れたり、条件式を間違えたまま実行してしまったら、ずーーーーっと続いているわけで...。この入力キーを忘れないようにしたいです...。

whileで遊んでみた。

さて、最後に実験。

fig04

某有名ご一家の長男が20歳を超えた時(21歳になったとき)に、何年が経っていて、さらに長女と甥っ子が何歳になっているかっていう誰の役にも立たないものを作りました。どうぞご笑納ください。
文字と数字を結合した形で結果を表示させたい場合は、同じ型にしてあげる必要があります。数字を文字にする場合はstr、文字を数字にする場合はintを使います。私はこれをうっかり忘れがちなので気を付けます...。

では今回はここで終了です。お付き合いいただきありがとうございました。

参考:

とほほのPython入門 - 演算子

【Python】小数点の四捨五入、切り上げ、切り捨て(round, math.ceil, math.floor)

Pythonのwhile文によるループ処理(無限ループなど)

ビット演算に関する演算子

ビット演算入門 | Qiita

 


 

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  Microsoft Azure  Docker  Kubernetes