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

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

研修コース検索

コラム

ゼロから歩くPythonの道

CTC 教育サービス

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

第9回 繰り返す方法を学んでみた ~ for構文編 + インデント ~ (菱沼佑香) 2020年7月

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

さて、前回から「Chapter4 プログラムを構成する基本的な機能」に入りました。Pythonのプログラムを構成する6大要素とされているもののうち、変数について確認しました。
今回は「繰り返し」の項目について学んでいこうと考えています。

<6大要素のメモ>
①計算機能
②変数(へんすう)
③繰り返し    ←ココ。
④条件分岐
⑤関数
⑥モジュール(外部機能)

ちなみに、インデントの学習にちょうど良い機会だったので、インデントについてもまとめてみました。

繰り返しの処理は2種類ある

さて、今回学習するのは、その言葉のまま「繰り返し(をさせる方法)」になります。
何回も繰り返したい命令を何回も書くのは正直面倒くさいし、非効率的です。たった一つの命令で、指定した回数分を繰り返してくれる命令があるなら、大量のデータを処理しなければならない人なら間違いなく、そんな命令を作ってくれた人に感謝の気持ちを捧げながら飛びつくことでしょう。私なら飛びつく。

-----引用-----
プログラムを書いていると、同じ処理を何度も繰り返し実行したいことがあります。簡単な例として、1から5までの数字を順に表示したいと考えます。素直に考えると以下のように、printを5回並べる方法が、まず挙げられます。
> print(1)
> print(2)
> print(3)
> print(4)
> print(5)

100まで表示したいときには、どうしたらいいでしょうか?
(中略)100行も記述するのでしょうか?これは現実的ではなさそうです。
----------------

上記を転記するために、たった5行を繰り返すだけだったのにとっても面倒くさいと思った私は当然コピペしましたが、コピペしても結局一部を書くor書き換える必要があるので非常に面倒くさいと思いました。
これが100行とか...。面倒くさいを通り越してそれをやる意味を考え始めること間違いなし。ではそんなことをしなくていいようにするにはどのような命令文を利用するかと言うと...

-----引用-----
そこで、どのようなプログラミング言語にも、「繰り返し実行する構文」があります。Pythonでは、「どのような方法で繰り返すのか」によって、次の2つの構文があります。

①for構文
指定した値の列から1つずつ取り出し、それが尽きるまで繰り返す

②while構文
指定した条件を見たいしている間、実行する。
----------------

という2つの手段があるようです。なので、今回の記事ではfor構文を取り上げ、次回、while構文を学習することにします。

for構文の基本的な使い方とrange関数

さて、まずはfor構文の書き方から。

-----引用-----
リストとfor構文を使って、「5回繰り返す例」を示します。
>>> for a in [1,2,3,4,5]
>>> print(a)

(中略)と記述すると、「1」「2」「3」「4」「5」を1つずつ取り出して、変数aに代入しながら、その値が尽きるまで繰り返します。つまり、aの値が「1」「2」「3」「4」「5」と変化しながら繰り返されます。
----------------

これを実行すると、こうなります。

fig01

ただこれだと、データが100個あったら、100個分のデータを入力するのは変わらないので、面倒くささも当然さして変わりません。それを解決する手段はrange関数を使うことなのだそうです。
さて、このrange関数とは何者なのか。

-----引用-----
>>> range( 開始する値 , 終了する値 )
上のように記述すると、「終了する値未満」の連続したシーケンスを作成してくれます。ここで「未満」である点に注意してください。
「1,2,3,4,5」のように繰り返したいときは、
>>> range(1,5+1)
のように、終了は「1を足したもの」を指定する必要があります。
もちろん、range(1,6)と書いてもかまいません。
----------------

ということなので、先ほどの例から言えば、

fig02

と書くことができるようになるので、100個データがあるなら、range(1,100+1)と書いてあげればいいようです。ところで、for文の最後に「:(コロン)」がついていますよね。これを忘れるとSyntax Errorになりますので、うっかり忘れにご注意ください。実験中忘れまくって画面が赤くなりました。

ついでにこのrange関数が他にどんなことができるのかを調べてみました。

range関数で値を飛ばすこともできる

range関数で指定できる項目には3つあるようです。
>>> range ( 開始 , 終了 , 増分 )

3つ目の増分を設定すると、指定した範囲の値から、指定した値の分を飛ばした値を返す処理をしてくれるようです。(ちなみに、開始と増分の値は省略することも可能ですが、開始の値を設定しない場合は「0」からスタートします。)

つまり、range関数で、開始を1、終了を15にしただけの場合、単純に1~14までの数字が並ぶことになりますが、「増分」の値に2を設定してあげるとこうなります。(左)

fig03

そして減らすこともできます。
中央の画像は開始の値を1にしてしまったために、表示する結果がないという状況です。書いてから気づいたのです。ええ。どうぞご笑納ください。
正しくは、15を開始の値にして、終了を1にしてあげると正常な答えが返ってきます。(右)

for文の使い方で覚えておきたいほかの事。

①文字列からの取り出しもできる。(P93)
変数に「""」で囲んだ文字列を指定してあげると、入力された文字列を頭から順番に取り出してくれます。

fig04

②値はfor文の外でも設定できる
先に変数の中身を設定しておき、for文で表示したいリストを変数に指定できました。
例えばこんな感じ。文字列には「""」をお忘れなく。

fig05

(これ、リストとして指定した変数をうっかり忘れたら本当にどうなるのでしょう...。)

③繰り返しの結果の間に何か処理(文章とか)を挟むことができる。(P90)
例えばこういうことができます

fig06

上記でさせたのはリストで指定した値の前後に文字を追加しているのと、繰り返しの結果の間に文章を表示させる処理をしています。ちょっとくどいわ~くらいには苗字を主張しています。

ここで注意しなくてはならないのはインデントだと書かれていました。具体例がないと良くわからないなあと思ったので、これまでインデントについてはとりあえず横に置いてきましたが、ここでついに触れる時がやってきてしまいました。

インデントの役割は制御構造

テキストでは以下のように説明されています。

-----引用-----
P.75
行頭の空白は「インデント(字下げ)」と呼ばれ、段落をそろえる役割を示します。Pythonの場合、段落のそろえは、プログラムを見やすくするという目的ではなくて、制御構造を示します。そのため、行頭に余計な空白があるとエラーが表示されます。
(中略)制御構造を書くときには、左側に空白を入れなければならないことがあります。

P.89
繰り返す場所はインデントで指定する
(中略)Pythonでは、「どの部分を繰り返すのか」を、「右にずれたブロック(インデントされたブロック)」で判断します。
もしインデントしない場合には、文法エラーとなるので注意してください。

P.91
Pythonでは、インデントが1つのブロック単位となるので、インデントの範囲を間違えないように注意してください。
----------------

そこでこんな実験をしてみました。

fig07

どちらも同じ文章が表示されるように記述しましたが、結果が異なります。
左側:①のprint文の結果の表示の後に、②のprint文の結果が「毎回」表示
右側:①のprint文の結果の表示が「すべて終わった後」に、②のprint文の結果が「1度だけ」表示

なぜこのような違いが出たかと言えば、左側では2つのprint関数の前にインデントがあり、右側では1つ目のprint関数の前にのみインデントを入れたからとなります。
なので、一つの指令に対して行いたい動作は、インデントをそろえてあげればグループ(ブロック)として扱われる、ということのようです。
そこで、forを2つ以上用意した場合の書き方はどうなるのか、うまくいかないなあと思いながら探していたら、九九を計算する処理を見かけたので、ご紹介します。(画像内の式は参考サイトからそのまま頂きました。)

fig08

おお楽しい。
ちなみに最後のprint()を書かない場合、改行されずにずらーっと数字が並び、print()のインデントを直前のprintと同じ場所にすると結果が一つずつ改行されました。あまりの見づらさに、インデントとprintのありがたみが身に染みました。

for文ではほかに、処理を途中で止め(break)たり、特定の処理を飛ばし(continue)たり、終了後の処理の指定(else)もできるようですが、while構文やif文にも関わる内容のため、今回は割愛し、次回以降で取り上げたいと思います。

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

<参考リンク>
python for文を初心者向けに解説!for文基礎はこれで完璧|Udemy
Pythonのfor文によるループ処理(range, enumerate, zipなど)|note.nkmk.me
Pythonチュートリアル range関数
Pythonのrange関数の使い方を現役エンジニアが解説【初心者向け】
繰返し処理 - for, while 等|Python入門
Pythonのrange関数の使い方を現役エンジニアが解説【初心者向け】|TechAchademy

 


 

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