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行目のコードを、「変数」という観点で説明する。
今回、本稿で説明するのは、図1-a【再掲】における赤枠内のコードのみとなる。
なお、本稿で示すサンプルコードの実行環境については、Lesson 1を一読してほしい。
Lesson 1でも示したように、本連載のすべてのサンプルコードは、下記のリンク先で実行もしくは参照できる。
Python言語の基礎文法
それでは、変数の説明を始めよう。
変数の宣言と代入
前々回のLesson 2でも見たが、図1-aの2行目のコードは、リスト5-1のようになっている。
mnist = tf.keras.datasets.mnist
このコードは、
「左辺 = 右辺」
という構文になっている、とすでに説明済みだ。
右辺はtf.keras.datasets.mnistというコードになっており、意味は[tf]−[keras]−[datasets]という<モジュール階層>(=パッケージ)の中にあるmnistモジュールという内容だった。
同じmnistで紛らわしいが、左辺の「mnist」は変数(Variable)と呼ばれるものだ。変数とは「変わる数」と書いているが、データや値(数値など)を含むオブジェクト(=Pythonの世界における実体を持つ存在。詳細後述)が入れられ、しかもその内容が変わる可能性がある「箱」のようなものである。
つまりこの変数「mnist」とは、mnistモジュールというオブジェクトが入れられている「箱」というわけだ。
見方を変えると、mnistモジュールというオブジェクトに付けられた「mnist」という「ラベル/名札」とも言える。
図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
図8-2が実際の出力例である。module 'tensorflow.keras.datasets.mnist'と記載されており、確かにmnistは、mnistモジュール(module)を表すオブジェクトとなっていることが分かる。
オブジェクト
本稿ではここまでに何度も「オブジェクト」という用語が出てきているが、そもそもオブジェクトとは何なのか、ここでいったん説明しておこう。
Pythonプログラムの世界では、あらゆる「値/データといった実体」を持つものはオブジェクト(Object)と呼ばれる。今回までに登場したモジュールだけでなく、今後の連載で説明していく(※よって現段階では用語の意味は分からなくてよい)、数値・文字列値・リスト値・タプル値・辞書値といった値や、クラスのインスタンスなど(※いずれもPython言語仕様においてデータと表現される)、そのすべてがオブジェクトなのである。
各オブジェクトは、
- データ
という本体に加えて、
- 型(type): データの種類
- ID(identity): オブジェクトを識別するための固有値(整数)
という付随情報も持っている。
オブジェクトの「型」を調べるには、type()関数が使える。関数についてはLesson 7で説明するが、ここでは簡略的に説明すると、()の中にオブジェクトが指定できる。例えばリスト6-1は、変数の名前である「mnist」を()の中に記載している。
type(mnist) # moduleと出力される
このコードを実行すると、変数名「mnist」を通じてmnistモジュール(オブジェクト)にアクセスされ、そのオブジェクトの型が出力される。確かに「module」と出力されるのが確認できる。
また、オブジェクトの「ID」を調べるには、id()関数が使える。リスト6-2も同様に、変数名「mnist」を()の中に記載している。
id(mnist) # 140667186446808(※本稿の場合。読者ごとに違う数値)と出力される
このコードを実行すると、そのオブジェクトのIDが出力される。この例では「140667186446808」と出力された(※IDの数値は、Pythonランタイム*4ごと、つまり読者ごとに違う)。
*4 ランタイムは「プログラムの実行時」を意味する。本稿で使用しているGoogle Colabのようなインタラクティブシェルの場合、対話形式で実行が継続している状態となっているので、実行を意図的にリセット(=終了して再開)しない限り、リスト6-2を何度実行しても同じ数値になる。ちなみにGoogle Colabで実行をリセットしたい場合は、メニューバーから[ランタイム]−[すべてのランタイムのリセット]をクリックすればよい。
Copyright© Digital Advantage Corp. All Rights Reserved.