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

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

変数、オブジェクト ― Python基礎文法入門

2019年2月13日

Python言語の文法を、コードを書く流れに沿って説明していく連載。今回は、プログラミングの基本中の基本である変数と、Pythonの世界を構成するオブジェクトについて説明する。

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

 前回は「コメント」機能と「APIリファレンス」について紹介した。今回は、Pythonプログラミングの基本中の基本で、文法の中で一番大事である「変数」と、Pythonの世界を構成する「オブジェクト」について説明する。脚注や図、コードリストの番号は前回からの続き番号としている。

 本連載は、実際にライブラリ「TensorFlow」でディープラーニングのコードを書く流れに沿って、具体的にはLesson 1で掲載した図1-a/b/c/dのサンプルコードの順で、基礎文法が学んでいけるように目次を構成している。今回は、Lesson 2「モジュール」回でも使った2行目のコードを、「変数」という観点で説明する。

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

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

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

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

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

Python言語の基礎文法

 それでは、変数の説明を始めよう。

変数の宣言と代入

 前々回のLesson 2でも見たが、図1-aの2行目のコードは、リスト5-1のようになっている。

Python
mnist = tf.keras.datasets.mnist
リスト5-1 変数の宣言と代入のサンプルコード

 このコードは、

「左辺 = 右辺」

という構文になっている、とすでに説明済みだ。

 右辺はtf.keras.datasets.mnistというコードになっており、意味は[tf]-[keras]-[datasets]という<モジュール階層>(=パッケージ)の中にあるmnistモジュールという内容だった。

 同じmnistで紛らわしいが、左辺の「mnist」は変数Variable)と呼ばれるものだ。変数とは「変わる数」と書いているが、データや値(数値など)を含むオブジェクト(=Pythonの世界における実体を持つ存在。詳細後述)が入れられ、しかもその内容が変わる可能性がある「箱」のようなものである。

 つまりこの変数「mnist」とは、mnistモジュールというオブジェクトが入れられている「箱」というわけだ。

 見方を変えると、mnistモジュールというオブジェクトに付けられた「mnist」という「ラベル/名札」とも言える。

 図8-1では、箱にデータを入れる様子をイメージにした(本連載では、読者が、コードからこのような箱を視覚的にイメージしてもらうことを前提に、解説を進めていく)。

変数への代入、のイメージ
図8-1 変数への代入、のイメージ

 ここで特に注意してほしいのは、Pythonプログラミングにおける「左辺 = 右辺」の「=」は、数学のように「左辺と右辺がイコール(=同じ)」という意味ではなく、「左辺に右辺を代入assign)する」という意味になることだ。

 まとめると、このコードは、

変数 = データや値

という構文を使って、変数にデータや値を代入している、という意味になる。

 変数の名前は、アルファベットと数字と_(アンダースコア、アンダーバー)を組み合わせて好きな言葉にしてよい(ただし、先頭文字は必ずアルファベットか_にする必要がある。詳しくは、次回Lesson 5の「【コラム】変数などの命名規則について」で説明しているので、そちらでの解説を待ってほしい)。この例では変数名は、モジュール名と同じ「mnist」となっている。

 初出の変数は、変数の宣言とも呼ばれる。よってこの例では、変数mnistを宣言して、そこにtf.keras.datasets.mnistモジュールというオブジェクトを代入しているということになる。なお、通常は、何らかの(データや値などの)オブジェクトを代入せずに、変数を宣言することはできない

 いったん変数(=箱)に代入されたオブジェクトには、その変数の名前(=ラベル、名札)を通じてアクセスできる。具体的には、先ほどのmnistモジュールというオブジェクトには、変数の名前である「mnist」を記述すればアクセスできる、ということだ。下記のリスト5-2がその実例である。

 ちなみに本連載が前提とするGoogle Colabでは、リスト5-2のようにして、オブジェクトが代入された変数の名前のみを書くと、そのオブジェクトの内容が出力(=ユーザーに対して表示)される(この出力機能については、「データ構造編[Lesson 1]【コラム】インタラクティブシェルにおけるオブジェクト評価の自動出力」でも説明しているので、より詳しく知りたい人は参照してほしい。Lesson 7「関数」でもあらためて説明する)。オブジェクトの内容を確認しながら、コードを少しずつ書いていく際に便利なので覚えておいてほしい。

Python
mnist
リスト5-2 変数に代入されたオブジェクトの内容を確認

 図8-2が実際の出力例である。module 'tensorflow.keras.datasets.mnist'と記載されており、確かにmnistは、mnistモジュール(module)を表すオブジェクトとなっていることが分かる。

変数に代入されたオブジェクトの内容を確認
図8-2 変数に代入されたオブジェクトの内容を確認

オブジェクト

 本稿ではここまでに何度も「オブジェクト」という用語が出てきているが、そもそもオブジェクトとは何なのか、ここでいったん説明しておこう。

 Pythonプログラムの世界では、あらゆる「値/データといった実体」を持つものはオブジェクトObject)と呼ばれる。今回までに登場したモジュールだけでなく、今後の連載で説明していく(よって現段階では用語の意味は分からなくてよい)、数値・文字列値・リスト値・タプル値・辞書値といった値や、クラスのインスタンスなど(いずれもPython言語仕様においてデータと表現される)、そのすべてがオブジェクトなのである。

 各オブジェクトは、

  • データ

という本体に加えて、

  • type): データの種類
  • IDidentity): オブジェクトを識別するための固有値(整数)

という付随情報も持っている。

 オブジェクトの「型」を調べるには、type()関数が使える。関数についてはLesson 7で説明するが、ここでは簡略的に説明すると、()の中にオブジェクトが指定できる。例えばリスト6-1は、変数の名前である「mnist」を()の中に記載している。

Python
type(mnist)  # moduleと出力される
リスト6-1 オブジェクトの型を調べるコード例

 このコードを実行すると、変数名「mnist」を通じてmnistモジュール(オブジェクト)にアクセスされ、そのオブジェクトの型が出力される。確かに「module」と出力されるのが確認できる。

 また、オブジェクトの「ID」を調べるには、id()関数が使える。リスト6-2も同様に、変数名「mnist」を()の中に記載している。

Python
id(mnist)  # 140667186446808(本稿の場合。読者ごとに違う数値)と出力される
リスト6-2 変数「mnist」に代入されたオブジェクトのIDを調べるコード例

 このコードを実行すると、そのオブジェクトのIDが出力される。この例では「140667186446808」と出力された(IDの数値は、Pythonランタイム*4ごと、つまり読者ごとに違う)。

  • *4 ランタイムは「プログラムの実行時」を意味する。本稿で使用しているGoogle Colabのようなインタラクティブシェルの場合、対話形式で実行が継続している状態となっているので、実行を意図的にリセット(=終了して再開)しない限り、リスト6-2を何度実行しても同じ数値になる。ちなみにGoogle Colabで実行をリセットしたい場合は、メニューバーから[ランタイム]-[すべてのランタイムのリセット]をクリックすればよい。

 前掲のリスト6-2でid()関数に指定したのは変数「mnist」である。その中に、本当にtf.keras.datasets.mnistモジュールが入っているのだろうか? これを確認するために、変数名「mnist」ではなく、tf.keras.datasets.mnistモジュールを()の中に記載してみよう(リスト6-3)。

Python
id(tf.keras.datasets.mnist)  # 140667186446808(本稿の場合)と出力される
リスト6-3 tf.keras.datasets.mnistモジュールのIDを調べるコード例

 コードを実行すると、リスト6-2とリスト6-3で、全く同じID(整数値)が出力されたはずだ。つまり、変数「mnist」が表しているオブジェクトとtf.keras.datasets.mnistモジュールが、まったく同じオブジェクトであることが確認できた。

 このtype()関数/id()関数は、すべてのオブジェクトに対して利用できるので、今後の連載の中でさまざまなオブジェクトに対して試してみると、オブジェクトを学ぶための良い勉強になるだろう。Pythonの世界がすべてオブジェクトで構成されているおかげで、このようにすべて同じように扱えるのである。

 なお、今後の連載では、「変数mnist」という表記以外にも、オブジェクト代入後の変数に対しては「mnistオブジェクト」もしくは単に「mnist」という表記を使う場合があるので、覚えておいてほしい。

つづく

 今回はPython言語の基礎中の基礎とも言える「変数」と、Pythonの世界を構成する「オブジェクト」について説明した。次回は、基本的なデータの型である「bool型(ブール型)」「int型/float型(数値型)」「str型(文字列型)」について解説する。

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

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

機械学習 & ディープラーニング入門(Python編)[Lesson 4]
1. ディープラーニングを始めるための、Python基礎文法入門

一般的にディープラーニングはPython言語で開発する。実際に開発でよく使うPython言語の基本文法を厳選し、それらを図解で解説していく連載の初回である今回は、Python言語のバージョンについて説明する。

2018年12月26日(水)
機械学習 & ディープラーニング入門(Python編)[Lesson 4]
2. モジュール ― Python基礎文法入門

Python言語の文法を、コードを書く流れに沿って説明していく連載。今回は、プログラムの1行目に記載されることが多い、モジュールのインポートや、そのモジュールを含むライブラリのインストールについて説明する。

2019年2月4日(月)
機械学習 & ディープラーニング入門(Python編)[Lesson 4]
3. コメント ― Python基礎文法入門、APIリファレンスの使い方

Python言語の文法を、コードを書く流れに沿って説明していく連載。今回は、コードの中で頻繁に使われるコメント機能を説明。さらに、コーディング作業で常用するAPIリファレンスの使い方について紹介する。

2019年2月7日(木)
機械学習 & ディープラーニング入門(Python編)[Lesson 4]
4. 【現在、表示中】≫ 変数、オブジェクト ― Python基礎文法入門

Python言語の文法を、コードを書く流れに沿って説明していく連載。今回は、プログラミングの基本中の基本である変数と、Pythonの世界を構成するオブジェクトについて説明する。

2019年2月13日(水)
機械学習 & ディープラーニング入門(Python編)[Lesson 4]
5. データ型(ブール/数値/文字列) ― Python基礎文法入門

Python言語の文法を、コードを書く流れに沿って説明していく連載。今回と次回は、値やデータの型を説明。今回はその前編として、bool型/int型/float型/str型を取り上げる。

2019年2月14日(木)
Deep Insider の SNS :

本コンテンツの目次

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

変数、オブジェクト ― Python基礎文法入門


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