連載
» 2019年05月10日 05時00分 公開

機械学習&ディープラーニング入門(Python編):Lesson 10 ループ処理 ― Python基礎文法入門

Python言語の文法を、コードを書く流れに沿って説明していく連載。今回は前回に引き続き、制御構文を取り上げ、そのうちのループ処理について説明する。繰り返し処理を実装するための大事な文法である。

[一色政彦,デジタルアドバンテージ]

この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。

「機械学習&ディープラーニング入門(Python編)」のインデックス

連載目次

ご注意:本記事は、@IT/Deep Insider編集部(デジタルアドバンテージ社)が「deepinsider.jp」というサイトから、内容を改変することなく、そのまま「@IT」へと転載したものです。このため用字用語の統一ルールなどは@ITのそれとは一致しません。あらかじめご了承ください。

 前回は「制御構文(条件分岐)」について紹介した。続けて今回は、「制御構文(ループ処理)」について説明する。脚注や図、コードリストの番号は前回からの続き番号としている。

 本連載は、実際にライブラリ「TensorFlow」でディープラーニングのコードを書く流れに沿って、具体的にはLesson 1で掲載した図1-a/b/c/dのサンプルコードの順で、基礎文法が学んでいけるように目次を構成している。今回は、図1-c内の一部コードを取り上げる。

TensorFlowの公式チュートリアルのサンプルコード(3) 図1-c【再掲】 TensorFlowの公式チュートリアルのサンプルコード(3)

 今回、本稿で説明するのは図1-c【再掲】における赤枠内のコードのみとなる。

 なお、本稿で示すサンプルコードの実行環境については、Lesson 1を一読してほしい。

 Lesson 1でも示したように、本連載のすべてのサンプルコードは、下記のリンク先で実行もしくは参照できる。


Google Colabで実行する
GitHubでソースコードを見る

Python言語の基礎文法

ループ処理(for文)

 それではループ処理について説明しよう。ループ処理は、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)
  # ……省略……

リスト13-1 ループ処理(for文)を行うコード例
実行結果は、後掲の図14-2で示す。

ループ処理(for文)、のイメージ 図14-1 ループ処理(for文)、のイメージ

 インデントによるブロック表現はすでに何度も説明しているので、そろそろ慣れてきただろうか。for文にも、ブロックの開始を意味するコロン:があり、インデントを付けて配下のブロック内に処理が記載されている。このように、Pythonの書き方は基本的にワンパターンである。

 for文は、

for <変数> in <コレクション>:

という構文になっている。

 リスト13-1を見ると、まず<コレクション>部分に、range(25)と記載されている。これは、range()と最後にかっこが付いているので「関数」だと気付く。range()関数は、012、……という、整数値が順番に並んだリスト値のようなオブジェクト(厳密には、数のイミュータブルなシーケンスを表すrangeオブジェクト)を生成するためのもので、引数に何個の整数値を作るかを指定する。この場合は、25を指定しているので、024の25個の整数値を持つリスト値が生成される。

 プログラミング初心者であれば、25を指定しているのに、24までというのが「気持ち悪い」と思ったかもしれない。こうなる理由は0から番号をスタートしているためであるが、多くのプログラミング言語では1スタートではなく、0スタートを採用している。よって1番から番号を数えたい場合は、+1(プラス1)してあげなければならない。ブロック内でi+1とプラス1するコードがあるのは、このためだ。

 変数i*7には、コレクション(今回はリスト値)の先頭から順に、値が代入される。その代入のたびに、配下のブロックが実行される。今回は0スタートなので、最初はi = 00が入り、ブロック内のi+11と計算される。ブロック内のすべてのコードを実行完了すると、for i ……に戻って、次はi = 11が入り、ブロック内のi+12と計算される。このような形で、変数iに次々とリスト値の個別の値を代入していきながら、今回の例では全25回繰り返し、処理を実行していく。

*7 このように0123……と並ぶ整数値はインデックス番号index)と呼ぶと、「Lesson 6」ですでに説明済みである。


 なお、Pythonの言語仕様とは関係はないがplt.subplot(5, 5, i+1)は、全体を5×5の領域に区切り、そのi+1番目の場所に小さなグラフを描画(=プロット)するという処理である。よって、for文のループ処理によって、左上から右下まで、順々にグラフがプロットされていくことになる(図14-2)。この領域に割り振る番号が1始まりのために、リスト13-1ではi+1のようにして、range関数で得られる整数値と番号のすり合わせを行っている。

ループ処理(for文)の実行例 図14-2 ループ処理(for文)の実行例
なおリスト13-1のコード例では、グラフの中身を設定するコードを省略しているので、25個すべてのグラフが空で描画されている。

ループ処理(while文)

 for文は、コレクションの範囲分を1つずつ順に実行していく。一方、while文には、条件に適合するうちはずっと処理を実行し続ける、という違いがある。whileは、図1-a/b/c/dには含まれていないが、よく使う制御構文である。

 ここでは、先ほどのfor文をwhile文に書き直してみよう。条件は「i25より小さい間は、ブロック内のコードを実行する」というものにする(リスト13-2、図14-3)。

import matplotlib.pyplot as plt  # 下記コードの実行に必要なライブラリを追記

i = 0
while i < 25:
  plt.subplot(5, 5, i+1)
  i = i + 1
  # ……省略……

リスト13-2 ループ処理(while文)を行うコード例

ループ処理(while文)、のイメージ 図14-3 ループ処理(while文)、のイメージ

 while文は、

while <条件>:

というシンプルな構文になっている。<条件>はbool値(真偽値)となり、前回Lesson 9のif文で学んだ条件指定方法がそのまま使える。前回の表2で比較演算子を示したが、今回の例では、a < b(=bより、aが小さい)という用法で使える<演算子が使える。

 なおここでは、25以下i <= 25)ではなく、25より小さいi < 25)とするのがポイントだ。i = 0というコードで0スタートにしており、ループ実行されるブロック内のi = i + 1というコードで、変数ii + 1の計算結果を代入することで、iの値を1ずつ増やしている。つまり、iの値を024まで変更しながら合計で25回ブロックの処理が実行される。もし<=を使うと、iの値が25のときにもブロックの処理が実行されてしまい、繰り返し処理の回数が26回になってしまう。こういったカウントミスは、よくあるバグ(=プログラムのミス、不具合、エラー)なので気を付けてほしい。

ループ処理の中断と継続

 for文とwhile文では、任意のタイミングでループを中断することもできる。これには、中断したいところでbreakを記載すればよい。例えばリスト13-3ではif文を使って「iが2以上ならbreak」しているので、012の3回でループが中断する。

for i in range(25):
  plt.subplot(5, 5, i+1)
  if i >= 2:
    break
  # ……省略……

リスト13-3 ループ処理を中断するコード例

 実行結果は図14-4のようになる。

リスト13-3の実行例 図14-4 リスト13-3の実行例

 また、ブロックの途中で、それ以降のブロックのコードを実行せずに、次のループにスキップして継続することもできる。例えばリスト13-4ではif文を使って「iが2以上なら何もブロックコードを実行せずにcontinue」しているので、01の2回だけブロックコードが実行され、2以降ではブロックコードを毎回スキップしながら最後までループする。

for i in range(25):
  if i >= 2:
    continue
  plt.subplot(5, 5, i+1)
  # ……省略……

リスト13-4 次のループ処理にスキップして継続するコード例

 実行結果は図14-5のようになる。

リスト13-4の実行例 図14-5 リスト13-4の実行例

 以上、条件分岐とループ処理を説明した。キーボードのテンキーにも[/]/[*]/[-]/[+]とあるのであえて説明不要だと思うが、一応、文法事項ということで、最後に四則演算について簡単に確認しておこう。

四則演算

 先ほど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.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。