Python言語の文法を、コードを書く流れに沿って説明していく連載。今回は前回に引き続き、制御構文を取り上げ、そのうちのループ処理について説明する。繰り返し処理を実装するための大事な文法である。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
ご注意:本記事は、@IT/Deep Insider編集部(デジタルアドバンテージ社)が「deepinsider.jp」というサイトから、内容を改変することなく、そのまま「@IT」へと転載したものです。このため用字用語の統一ルールなどは@ITのそれとは一致しません。あらかじめご了承ください。
前回は「制御構文(条件分岐)」について紹介した。続けて今回は、「制御構文(ループ処理)」について説明する。※脚注や図、コードリストの番号は前回からの続き番号としている。
本連載は、実際にライブラリ「TensorFlow」でディープラーニングのコードを書く流れに沿って、具体的にはLesson 1で掲載した図1-a/b/c/dのサンプルコードの順で、基礎文法が学んでいけるように目次を構成している。今回は、図1-c内の一部コードを取り上げる。
今回、本稿で説明するのは図1-c【再掲】における赤枠内のコードのみとなる。
なお、本稿で示すサンプルコードの実行環境については、Lesson 1を一読してほしい。
Lesson 1でも示したように、本連載のすべてのサンプルコードは、下記のリンク先で実行もしくは参照できる。
それではループ処理について説明しよう。ループ処理は、for文もしくはwhile文で実現する。それぞれ、順に説明する。
まずfor文のコードは、図1-cの2行目以降にある。リスト13-1がそれで、イメージが図14-1である。
import matplotlib.pyplot as plt # 下記コードの実行に必要なライブラリを追記
for i in range(25):
plt.subplot(5, 5, i+1)
# ……省略……
インデントによるブロック表現はすでに何度も説明しているので、そろそろ慣れてきただろうか。for文にも、ブロックの開始を意味するコロン:があり、インデントを付けて配下のブロック内に処理が記載されている。このように、Pythonの書き方は基本的にワンパターンである。
for文は、
for <変数> in <コレクション>:
という構文になっている。
リスト13-1を見ると、まず<コレクション>部分に、range(25)と記載されている。これは、range()と最後にかっこが付いているので「関数」だと気付く。range()関数は、0、1、2、……という、整数値が順番に並んだリスト値のようなオブジェクト(厳密には、数のイミュータブルなシーケンスを表すrangeオブジェクト)を生成するためのもので、引数に何個の整数値を作るかを指定する。この場合は、25を指定しているので、0〜24の25個の整数値を持つリスト値が生成される。
プログラミング初心者であれば、25を指定しているのに、24までというのが「気持ち悪い」と思ったかもしれない。こうなる理由は0から番号をスタートしているためであるが、多くのプログラミング言語では1スタートではなく、0スタートを採用している。よって1番から番号を数えたい場合は、+1(プラス1)してあげなければならない。ブロック内でi+1とプラス1するコードがあるのは、このためだ。
変数i*7には、コレクション(今回はリスト値)の先頭から順に、値が代入される。その代入のたびに、配下のブロックが実行される。今回は0スタートなので、最初はi = 0と0が入り、ブロック内のi+1は1と計算される。ブロック内のすべてのコードを実行完了すると、for i ……に戻って、次はi = 1と1が入り、ブロック内のi+1は2と計算される。このような形で、変数iに次々とリスト値の個別の値を代入していきながら、今回の例では全25回繰り返し、処理を実行していく。
なお、Pythonの言語仕様とは関係はないがplt.subplot(5, 5, i+1)は、全体を5×5の領域に区切り、そのi+1番目の場所に小さなグラフを描画(=プロット)するという処理である。よって、for文のループ処理によって、左上から右下まで、順々にグラフがプロットされていくことになる(図14-2)。この領域に割り振る番号が1始まりのために、リスト13-1ではi+1のようにして、range関数で得られる整数値と番号のすり合わせを行っている。
for文は、コレクションの範囲分を1つずつ順に実行していく。一方、while文には、条件に適合するうちはずっと処理を実行し続ける、という違いがある。whileは、図1-a/b/c/dには含まれていないが、よく使う制御構文である。
ここでは、先ほどのfor文をwhile文に書き直してみよう。条件は「iが25より小さい間は、ブロック内のコードを実行する」というものにする(リスト13-2、図14-3)。
import matplotlib.pyplot as plt # 下記コードの実行に必要なライブラリを追記
i = 0
while i < 25:
plt.subplot(5, 5, i+1)
i = i + 1
# ……省略……
while文は、
while <条件>:
というシンプルな構文になっている。<条件>はbool値(真偽値)となり、前回Lesson 9のif文で学んだ条件指定方法がそのまま使える。前回の表2で比較演算子を示したが、今回の例では、a < b(=bより、aが小さい)という用法で使える<演算子が使える。
なおここでは、25以下(i <= 25)ではなく、25より小さい(i < 25)とするのがポイントだ。i = 0というコードで0スタートにしており、ループ実行されるブロック内のi = i + 1というコードで、変数iにi + 1の計算結果を代入することで、iの値を1ずつ増やしている。つまり、iの値を0〜24まで変更しながら合計で25回ブロックの処理が実行される。もし<=を使うと、iの値が25のときにもブロックの処理が実行されてしまい、繰り返し処理の回数が26回になってしまう。こういったカウントミスは、よくあるバグ(=プログラムのミス、不具合、エラー)なので気を付けてほしい。
for文とwhile文では、任意のタイミングでループを中断することもできる。これには、中断したいところでbreakを記載すればよい。例えばリスト13-3ではif文を使って「iが2以上ならbreak」しているので、0、1、2の3回でループが中断する。
for i in range(25):
plt.subplot(5, 5, i+1)
if i >= 2:
break
# ……省略……
実行結果は図14-4のようになる。
また、ブロックの途中で、それ以降のブロックのコードを実行せずに、次のループにスキップして継続することもできる。例えばリスト13-4ではif文を使って「iが2以上なら何もブロックコードを実行せずにcontinue」しているので、0、1の2回だけブロックコードが実行され、2以降ではブロックコードを毎回スキップしながら最後までループする。
for i in range(25):
if i >= 2:
continue
plt.subplot(5, 5, i+1)
# ……省略……
実行結果は図14-5のようになる。
以上、条件分岐とループ処理を説明した。キーボードのテンキーにも[/]/[*]/[-]/[+]とあるのであえて説明不要だと思うが、一応、文法事項ということで、最後に四則演算について簡単に確認しておこう。
先ほどi+1という数値をプラスする(=足す)計算式が出てきた。このような、足す(加法)、引く(減法)、掛ける(乗法)、割る(除法)という計算をまとめて四則演算と呼ぶ。これは小学校の算数で習った。本シリーズの学習生の皆さんであれば、難しいところはないだろう。
プログラミングの場合、掛ける(×)の記号が*になり、割る(÷)の記号が/になるという違いがある。Pythonで四則演算に使える算術演算子を表3にまとめた。
算術演算子 | 記述例 | 意味 |
---|---|---|
+ | a + b | a+b(足す) |
- | a + b | a−b(引く) |
* | a * b | a×b(掛ける) |
/ | a / b | a÷b(割る) |
% | a % b | a÷bの余り |
表3 四則演算に使える算術演算子 |
/で割り切れない場合、余りが出る。その余りは%で計算できる。なお、数学的に数値を0で割ることはできないので、Pythonでもエラーになる。数値を0で割るミスは起こりがちなので、特に「割る側の変数に、数値0が代入されたまま計算しないよう」に注意しよう。
Copyright© Digital Advantage Corp. All Rights Reserved.