機械学習 & ディープラーニング入門(Python編)[Lesson 10]

機械学習 & ディープラーニング入門(Python編)[Lesson 10]

ループ処理 ― Python基礎文法入門

2019年5月10日

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

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

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

 本連載は、実際にライブラリ「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である。

Python
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)。

Python
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回でループが中断する。

Python
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以降ではブロックコードを毎回スキップしながら最後までループする。

Python
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 + ba+b(足す)
-a + ba-b(引く)
*a * ba×b(掛ける)
/a / ba÷b(割る)
%a % ba÷bの余り
表3 四則演算に使える算術演算子

 /で割り切れない場合、余りが出る。その余りは%で計算できる。なお、数学的に数値を0で割ることはできないので、Pythonでもエラーになる。数値を0で割るミスは起こりがちなので、特に「割る側の変数に、数値0が代入されたまま計算しないよう」に注意しよう。

 説明するまでもないと思うが、念のため、コード例を挙げておこう(リスト13-5)。

Python
num = 5 + 3
print(num)  # 8(足し算)

num = 5 - 3
print(num)  # 2(引き算)

num = 5 * 3
print(num)  # 15(かけ算)

num = 5 / 3
print(num)  # 1.6666666666666667(割り算)

num = 5 % 3
print(num)  # 2(余り)
リスト13-5 四則演算のコード例

 ちなみにLesson13で詳しく説明するが、Python 3系とPython 2系では、/演算子により割り算による計算結果が異なる。本連載はPython 3系を使うのを前提としているが、Python 3系では割り算の結果を「1.6666666666666667」というように小数点部分まで算出するのでより自然である。

 なお、(今回は掲載していない)図1-aの4行目に割り算の計算式がある(リスト13-6)。

Python
#import tensorflow as tf
#mnist = tf.keras.datasets.mnist
#(x_train, y_train),(x_test, y_test) = mnist.load_data()
# 以下のコードを動かすためには、上記2行を事前に実行しておく必要がある
#---------------------------------------------------------------------

x_train, x_test = x_train / 255.0, x_test / 255.0
リスト13-6 NumPyの四則演算機能が使われているコード例

 この割り算についてはLesson 6で説明済みなので繰り返しなるが、実際にはPython言語の四則演算ではなく、ライブラリ「NumPy」の計算機能である(詳しくは「データ構造編[Lesson 3]」を参照)。もっと具体的に言うと、変数x_trainと変数x_testはリスト値(厳密にはNumPyの配列値)であるが、これに対して割り算を行っている。数値ではなく、このようなコレクションに対する割り算は、Pythonの算術演算子では計算できない。これを実現しているのは、「NumPy」と呼ばれる算術ライブラリの機能である。NumPyではリストの全要素に対してまとめて割り算を実行できるのだ。

つづく

 以上、「制御構文(ループ処理)」を説明した。いよいよ基本文法については最後の機能項目となる。次回は、「クラスの利用」を説明する。ちなみにその後は、応用的だがよく使われる文法を、落穂拾いとして簡単に紹介していく。

  • このエントリーをはてなブックマークに追加

※以下では、本稿の前後を合わせて5回分(第8回~第12回)のみ表示しています。
連載の全タイトルを参照するには、[この記事の連載目次]を参照してください。

機械学習 & ディープラーニング入門(Python編)[Lesson 10]
8. 関数の定義 ― Python基礎文法入門

Python言語の文法を、コードを書く流れに沿って説明していく連載。前回に続けて、今回は関数の定義方法を説明する。加えて、デフォルト引数やキーワード引数という重要機能、Python言語で特徴的なインデントについても説明する。

2019年3月25日(月)
機械学習 & ディープラーニング入門(Python編)[Lesson 10]
9. 条件分岐 ― Python基礎文法入門

Python言語の文法を、コードを書く流れに沿って説明していく連載。今回は制御構文のうち、条件分岐について説明する。ロジックや処理フローを定義するための大事な文法である。

2019年4月8日(月)
機械学習 & ディープラーニング入門(Python編)[Lesson 10]
10. 【現在、表示中】≫ ループ処理 ― Python基礎文法入門

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

2019年5月10日(金)
機械学習 & ディープラーニング入門(Python編)[Lesson 10]
11. クラス ― Python基礎文法入門

Python言語の文法を、コードを書く流れに沿って説明していく連載。今回と次回は、クラスを取り上げる。今回は、そのうちの利用方法について説明する。

2019年8月16日(金)
機械学習 & ディープラーニング入門(Python編)[Lesson 10]
12. クラスの定義 ― Python基礎文法入門

Python言語の文法を、コードを書く流れに沿って説明していく連載。前回と今回は、クラスを取り上げている。今回は、そのうちの定義方法について説明する。これでPython言語の基礎文法は完了だ。

2019年8月21日(水)
Deep Insider の SNS :

本コンテンツの目次

機械学習 & ディープラーニング入門(Python編)[Lesson 10]
機械学習 & ディープラーニング入門(Python編)[Lesson 10]

ループ処理 ― Python基礎文法入門


本コンテンツに関連する重要用語