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

機械学習&ディープラーニング入門(Python編):Lesson 18 「Python言語基礎文法」と「いくつかの応用文法」のまとめ

コードを書く流れに沿って説明してきたPython言語の基礎文法と、いくつかの応用文法のポイントを箇条書きでまとめる。

[一色政彦,デジタルアドバンテージ]
「機械学習&ディープラーニング入門(Python編)」のインデックス

連載目次

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

 本連載のサンプルコードだけを眺めたい場合は、

GitHubのページ

が便利だ。本稿と併せて活用してほしい。

【まとめよう】Python言語基礎文法といくつかの応用文法

  • Python言語の学び方: 基礎文法を学習&体験したら、あとはOJT的に実務をする中で「習うより慣れろ」で身に付けよう!
  • Python言語のバージョン: バージョン3系と旧バージョン2系(2020年よりサポート期間終了)があり、当然、3系が最新で、基本的にこれを使う
  • 配布用プロジェクト: PyPIというサイトで各種ライブラリが配布されている。ライブラリ「TensorFlow」はJupyter Notebookで!pip install tensorflowというコマンドでインストールできる
  • モジュール: インポートできる単位での、機能の集まり。import tensorflow as tfのように、import文でインポートできる
  • モジュールの利用: インポート済みモジュール内の階層は.でたどれる。例えばtfモジュール階層の下位にあるmnistモジュールは、tf.keras.datasets.mnistというコードで使用できる
  • モジュールの定義: モジュール自体は、基本的にPythonファイル(拡張子は「.py」)として定義されている。例えばmnistモジュールは、mnist.pyファイルで定義されている
  • パッケージ: 複数のモジュールをまとめたフォルダーのような機能で、ツリー状のフォルダー階層のように<モジュール階層>を形成できる(その階層名は「名前空間」とも呼ばれる)。パッケージは「モジュール」としてインポートできる
  • APIリファレンス: ライブラリが提供するモジュールなど各種API機能が説明されているリファレンス(=参照ページ)のこと。APIドキュメントやヘルプとも呼ばれる
  • コメント: コードに対する補足説明として使われる。コードとしては無視され、実行されない部分となる。各行において#の後ろはコメントとして扱われ実行されない
  • docstringヘルプ: '''により複数行のコメントが記述できる機能を活用して、関数やクラス(いずれも後述)の説明を記載したもの。[Tab]キーにより、ヘルプドキュメントとして表示できる
  • 変数の宣言と代入: 「左辺 = 右辺」という構文で、「変数 = データや値」を意味する。=は「イコール」ではなく「代入」を意味する
  • データの型(ブール/数値/文字列): True(真)/False(偽)といった「ブール(bool)」型、01-2といった「整数(int)」型、0.01.2-2.5といった「浮動小数点数(float)」型、'abc''012''あいう'といった「文字列(str)」型がある
  • 文字列のエスケープシーケンス: \を付けた特殊文字。代表的なものに、バックスラッシュ\\/一重引用符\'/二重引用符\"/タブ文字\tがある。改行も\nのように書く
  • 変数などの命名規則: 原則(PEP 8)的には、「すべて小文字で書き、単語の区切りは_(アンダースコア)を使う」「定数は、すべて大文字で書き、単語の区切りは_(アンダースコア)を使う」「クラスと例外は、この原則に当てはまらず、単語の先頭は大文字で書き、単語の区切りは何も入れない」
  • データの型(リスト/タプル/辞書): [0.0, 1.2, -1.2] といった「リスト(list)」型、('Yamada','Taro') といった「タプル(tuple)」型、{'a': 2.5, 'b': 1.4 }といった「辞書(dict)」型などがある。これらは「コレクション」や「コンテナー」とも呼ぶ
  • データの型(各種オブジェクト): 変数に代入できるデータや値として、モジュールやクラスのインスタンスなどのオブジェクトも使用できる
  • 関数の利用: 何らかの処理を行う機能を持つ。load_data()のように単語の最後に丸括弧()を付ける。丸括弧()の中にはarg1のような「引数」(ひきすう)を持つこともある。また、変数 = load_data()のように処理結果を「戻り値」として返すこともある
  • 関数の定義: def load_data():のように、def文で関数を定義し、配下のブロック内に処理を記述し、処理結果をreturn文で戻り値として返す
  • デフォルト引数: 関数の定義時に、def load_data(path='mnist.npz'):='mnist.npz'のように、デフォルトで使われる引数を指定すること。関数の呼び出し時に、load_data()のようにして、デフォルト値のある引数は値の指定を省略することもできる
  • キーワード引数: 関数の呼び出し時に、mnist.load_data('some.npz'):ではなく、mnist.load_data(path='some.npz'):path=のように、引数名を指定して値を渡すこと
  • インデントで明示するブロック/スコープ: インデントとは、半角スペースで左に余白を作ることで、通常は4つ(TensorFlowのコーディング規約では2つ)の半角スペースで作る。インデントによりブロック(=開始〜終了の範囲)を作成する。似た概念にスコープ(=変数などにアクセスできる範囲)がある。関数のブロックは関数内「局部」を意味する「ローカルスコープ」でもある。モジュールはモジュール内「全体」を意味する「グローバルスコープ」を持つ
  • 制御フロー文: if文を使った条件分岐と、for文やwhile文を使ったループ処理がある。いずれも、各文の配下に、何らかの処理を行うブロックを持つ
  • 条件分岐: if <条件>:という構文を使う。<条件>は、==!=>>=<<=といった比較演算子を使って表現できる。間にelif文を追加したり、最後にelse文を追加したりして、複数の条件分岐を記述できる
  • ループ処理(for文): for <変数> in <コレクション>:という構文を使う。0/1/2……というインデックス番号順で、コレクション内の各要素が1つずつ変数に代入され、要素ごとにブロック内の処理を繰り返し実行する
  • ループ処理(while文): while <条件>:という構文を使う。<条件>には比較演算子が使える。条件に一致する間は、ブロック内の処理を繰り返し実行する
  • ループ処理の中断と継続: breakを記述した場所でループは中断される。continueを記述した場所でその下のブロックのコードは実行されずにループが継続される(ループの次の繰り返しが開始される)
  • 四則演算: +(足す)、-(引く)、*(掛ける)、/(割る)、%(余り)といった数値の四則演算が行える。ただし機能が単純なので、代わりに、より高機能な算術ライブラリ「NumPy」が使われることが多い
  • クラスの利用: クラスは基本的にインスタンス(=実体)を生成して使う。インスタンス生成で初期化のために呼び出されるのが__init__という特殊な関数(多くのプログラミング言語で「コンストラクター」と呼ばれる)。クラスの実体の中にある変数は「インスタンス変数」、関数は「インスタンスメソッド」と呼ばれる
  • オブジェクト: クラスのインスタンスのように「実体」を持つものは「オブジェクト」と呼ばれる。また、モジュールやデータ/値、さらには関数なども、Pythonでは「オブジェクト」である。つまりPythonプログラムの世界は、すべてオブジェクトで構成されている
  • クラスの利点: 物体+機能のまとまりごとにまとめる「カプセル化」、機能を親から子へ、さらに子から孫へと引き継げる「継承」、アンダースコア2個__や1個_を変数やメソッドの頭に付けて表現する「アクセス制限」が使えること。これによって、大規模なプログラムを整理できるというメリットがある
  • クラスの定義: class文で定義する。ブロック内に定義した__init__関数はコンストラクターとなる。インスタンスメソッドはdef文で定義する。def文には、自分自身のオブジェクトを意味するselfを第1引数に記述する必要がある
  • 旧Pythonバージョン2環境への対応: Pythonファイルの冒頭で、from __future__ import xxxというコードによりabsolute_importdivisionprint_functionunicode_literalsモジュールをインポートすることで、バージョン2系でも3系のような書き方ができるようになる
  • Python標準ライブラリ: PyPI経由でライブラリを導入しなくても、Pythonに標準で同梱されている標準ライブラリも多くの基本機能を提供している。例えばOS(オペレーティングシステム)関連や、インターネット関連、CSVファイル関連、「pickle」と呼ばれる形式でのPythonオブジェクトデータの保存機能といった基本機能などなど
  • if条件式: C言語系の三項演算子に相当するもので、「if式」とも呼ばれ、<真の場合の値> if <条件> else <偽の場合の値> という構文を使う。<条件>には、条件文(=if文)と同様に比較演算子が使える
  • and/or/not論理演算子: 複数の条件は、条件文を複数書かなくても、and(両方が真)/or(いずれかが真)/not(真ではないとき)という論理演算子を使って1文にまとめて記述することもできる
  • ラムダ式: 関数を文ではなく式として記述できる。lambda <引数>: <何らかの処理>という構文を使う。特に、シンプルな処理しか実装しないコールバック関数を作るときに便利
  • リスト内包表記: []によるリストの宣言として記述し、リスト値を生成する。[<ループ処理> for <変数> in <コレクション>]という構文を使う。例えば[i+1 for i in range(5)]というコードは、[1, 2, 3, 4, 5]というリスト値を生成する
  • 例外: いわゆるエラー(=プログラム上の異常事態)のことで、エラー発生時に何らかの対処を取るためのPython言語機能。tryexceptという構文を使う。例えばファイルがない状態でopen()関数を呼び出すとFileNotFoundErrorという例外が発生する。これがexcept文配下のブロックで捕捉(=キャッチ)できる

【チャレンジ問題】

 本連載が用意した、

Google Colabのノートブック

をコピー(=Google Colabのメニューバーにある[ファイル]メニューの[ドライブにコピーを保存]をクリック)して、上から順にコードを実行しながら、基礎文法を復習しよう。これが今回のチャレンジ問題だ。

まとめ

 以上、ディープラーニングを実践するうえで必ず必要となる「Python言語の基礎文法」について一通り説明した。確かに今回は長く、理解することや覚えることが大量にあった。特に初めてプログラミングに触れた人は、「とても全部は理解できない、覚えてられない」と、出ばなをくじかれたように感じたかもしれない。そんな人はこんなふうに考えてほしい。

 車の運転は、どうやってうまくなるだろうか?

 最初に、免許を取るために、自動車教習所に通う。そこで最短なら1カ月、通常は2カ月程度、学科教習と技能実習を受ける。本連載を読むことは、この自動車教習所に通うようなものだ。ここで根本的な知識やスキルの訓練を積むのだ。最後まで読んでみて「プログラミングの基礎がまだ身に付いていない」と感じられるのであれば、本稿を数回読むことで知識を頭に定着させるとより良いだろう。

 次に、車の免許を取ってからは、1年間ほど初心者マークを付けて公道を走る。実地で車を運転すればするほど、車の運転がうまくなっていくだろう。それと同じように、プログラミングも実用を続けるうちに慣れて、思いどおりに使いこなせるようになる。本連載の初回でも述べたように「OJTで学んでいけばよい」のだ。

 そうやってプログラミングの知識やスキルが十分に身に付くと、他のプログラミング言語を習得する場合にも、Python言語の基礎知識を応用できる場面が多いことに気付くだろう。変数、関数、クラス、オブジェクトなどの基礎概念は、多くのプログラミング言語に共通するものだからだ。これは、車を新しく買い換えて車種を変えても、少し説明を聞くだけで、新しい車が使えることに似ている。アクセルやブレーキや、各種ボタンなどが少し違ったとしても、その基本的な機能は変わらないからだ。1つのプログラミング言語の基礎をしっかりと押さえることには、そういったメリットもあるので、ぜひ本稿を基点にPython言語に習熟することを目指してほしい。より深くPython言語をマスターしていきたい場合は、次に『Python入門 - @IT』を読破することをお勧めする。

 さて、次に読むべき連載「機械学習&ディープラーニング入門(データ構造編)」では、本連載稿では説明を簡略化したリスト値について、より詳細に見ていくことにする。さらに、Python言語の文法について、今回取りこぼした説明や、応用的な内容なども、少し含めているので、ぜひ本連載とセットで読み進めてほしい。

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

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

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

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

メールマガジン登録

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