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

機械学習&ディープラーニング入門(Python編):Lesson 4 変数、オブジェクト ― Python基礎文法入門

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

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

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

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

連載目次

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

 前回は「コメント」機能と「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のようになっている。

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「関数」でもあらためて説明する)。オブジェクトの内容を確認しながら、コードを少しずつ書いていく際に便利なので覚えておいてほしい。

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」を()の中に記載している。

type(mnist)  # moduleと出力される

リスト6-1 オブジェクトの型を調べるコード例

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

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

id(mnist)  # 140667186446808(本稿の場合。読者ごとに違う数値)と出力される

リスト6-2 変数「mnist」に代入されたオブジェクトのIDを調べるコード例

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

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


Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

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

メールマガジン登録

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