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

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

旧バージョン2環境への対応、標準ライブラリ ― Python言語の文法(応用編)

2019年8月24日

Python言語の文法を、コードを書く流れに沿って説明してきた本連載。今回からは、応用的なトピックを取り上げていく。今回は、Python 3文法で書いたコードをPython 2系環境で実行する方法とPython標準ライブラリについて説明する。

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

 本連載では、Python言語の基礎文法を本当に使われる必要最小限のものに絞って説明してきた。よって、これまでの連載内容をマスターしてきたのなら、例えばライブラリ「TensorFlow」の公式チュートリアルのサンプルコードなど、ほとんどのコードを読めるだろう。しかしは、これまでに説明したもの以外の文法もわずかながら使われている。具体的には例えば図17-1(2018年10月時点の公式チュートリアルより)のように「ラムダ式」や「リスト内包表現」といった、コードがより短く書ける文法などがそれである。

NumPyの軸の概念図(3次元配列)
図17-1 本連載で説明しなかったいくつかの応用文法の例

 そこで連載を終える前に、今回からの5回は、応用的だがよく使われる文法を、落穂拾いとして簡単に紹介していくことにしよう。

 今回は文法の応用トピックとして、Python 2系の環境(ただし、2020年1月1日よりサポート期間が終了するので、できるだけ利用しないことをお勧めする)でPython 3風の構文を使う方法と、Python標準で利用できるライブラリについて簡単に紹介する。脚注や図、コードリストの番号は前回からの続き番号としている。

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

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

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

Python言語の文法(応用編)

旧Python バージョン2環境への対応

 Lesson 1でも紹介したように、本連載で解説してきたPython 3言語仕様の一部は、Python 2系と互換性がない。ということは、「万が一、Python 2系を使う必要性が発生した場合には、さらにバージョン2も再学習しなければならないのか」という疑問が生じるだろう。しかしそんなことはない。実は、Python 2系の環境でもPython 3的にコードが書ける「逃げ道」が用意されているからだ。

 その逃げ道とは、リスト16-1のようにfrom __future__ import xxxというコードにより、__future__モジュールからいくつかのモジュールをインポートすることだ。

Python
# Pythonファイルの冒頭で以下を記述する
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from __future__ import unicode_literals

print(3 / 2) # 「1.5」。上記モジュールをインポートしないPython 2系だと「1」
リスト16-1 __future__モジュールをインポートするコード例

 1つ目のabsolute_importモジュールは、モジュールのインポート方法を「絶対インポート」(absolute import)優先にするためのものだ。Python 2 系では現在のディレクトリにあるものが優先される相対インポートになっていたが、これを無効にして絶対インポートを優先させる。これだけの情報では「内容がよく分からない」という人も多いと思うが、トラブル防止のため、Python 2系のファイルでは常にこれを設定した方がよい、と覚えておいてほしい。

 2つ目のdivisionモジュールは、割り算の計算方法をPython 3系に合わせるためのものだ。具体的には、Python 2系で/演算子により割り算を行うと、少数点以下を切り捨てる仕様だった。3系では切り捨てない仕様になっている。これはデータを扱う機械学習/ディープラーニングでは大きな影響を受けるので、必ずインポートしたい。

 3つ目のprint_functionモジュールは、print関数を使うためのものだ。Python 2系にもprintはあったが、関数ではなく文だった。つまりprint "メッセージ"のように記述していた。3系では前述のとおり、print("メッセージ")と丸括弧()を付けて関数で記述する。この関数としての書き方を2系でも有効にする。print関数はよく使うので、これも重要だ。

 4つ目のunicode_literalsモジュールは、日本語などのユニコード文字列を直接扱うためのものだ。Python 3の文字列はユニコード(unicode)だが、Python 2ではユニコードではない通常型の文字列が別に存在し、デフォルトでその通常型で扱っていた。つまり、文字列をPython 3と同じユニコードで扱うためのモジュールというわけである。Python 2系で日本語の文字列を使いたい場合は、必ずインポートしてほしい。

 以上の4つ、特に上から3つのモジュールは、Python 2系でプログラミングするなら、ほぼ必須である。例えば、公式チュートリアルのサンプルコード2018年10月時点の情報であり、現在では変更されている可能性があるので、ご了承いただきたい)でもリスト16-2のように、一番先頭の行に3つのモジュールのインポートが記載されている(ちなみに、リスト16-1では1行ずつ記載したが、このように,区切りで複数まとめてインポートすることもできる)。

Python
from __future__ import absolute_import, division, print_function

import tensorflow as tf
from tensorflow import keras

import numpy as np

print(tf.__version__)  # 1.14.0のように出力される
リスト16-2 __future__モジュールをインポートするコード例

 __future__モジュールでは、この他にもgenerator_stopモジュールなども提供されているが、現時点では不要なので説明を割愛する。

 Python 2環境への対応方法の説明は以上である。

Python 標準ライブラリ

 さて、話は変わり、次に、Python標準ライブラリに含まれるモジュールについて簡単に紹介しておこう。

 Pythonでは、PyPI経由でさまざまなライブラリを導入できることをLesson 2で説明した。だが、素のPython環境にも標準ライブラリが付属しており、OS(オペレーティングシステム)関連や、インターネット関連、CSVファイル関連、pickleと呼ばれる形式でのPythonオブジェクトデータの保存機能といった基本機能が、それぞれモジュールの形で提供されている。例えばOS関連の機能は、osモジュールをインポートすることで利用できる(リスト17)。

Python
import os

print(os.uname())
# posix.uname_result(sysname='Linux', nodename='x0x0x0', release='4.14.79+', version='#1 SMP Wed Dec 19 21:19:13 PST 2018', machine='x86_64')
# 上記の出力結果は環境により異なるので注意
リスト17 インポートしたosモジュールでOS情報を出力するコード例

 Python標準ライブラリにどのようなモジュールがあるかは、公式リファレンスを一度眺めてほしい。図17はそのスクリーンキャプチャで、ざっとスクロールしてみると、大量のモジュールが用意されているのが分かる。

Python標準ライブラリに含まれるモジュール群
図17 Python標準ライブラリに含まれるモジュール群

つづく

 今回は、Python 3文法に書いたコードをPython 2系環境で実行する方法を説明し、Python標準ライブラリについて紹介した。次回は、if条件式とand/or/not 論理演算子について紹介する。

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

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

機械学習 & ディープラーニング入門(Python編)[Lesson 13]
11. クラス ― Python基礎文法入門

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

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

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

2019年8月21日(水)
機械学習 & ディープラーニング入門(Python編)[Lesson 13]
13. 【現在、表示中】≫ 旧バージョン2環境への対応、標準ライブラリ ― Python言語の文法(応用編)

Python言語の文法を、コードを書く流れに沿って説明してきた本連載。今回からは、応用的なトピックを取り上げていく。今回は、Python 3文法で書いたコードをPython 2系環境で実行する方法とPython標準ライブラリについて説明する。

2019年8月24日(土)
機械学習 & ディープラーニング入門(Python編)[Lesson 13]
14. if 条件式、and/or/not 論理演算子 ― Python言語の文法(応用編)

本連載では、コードを書く流れに沿ってPython言語の基礎文法を説明してきた。今回は、応用的だが、利用頻度が高く重要な文法として、if条件式とand/or/not論理演算子を紹介する。

2019年8月25日(日)
機械学習 & ディープラーニング入門(Python編)[Lesson 13]
15. ラムダ式 ― Python言語の文法(応用編)

本連載では、コードを書く流れに沿ってPython言語の基礎文法を説明してきた。今回は、応用的だが、利用頻度が高く重要な文法として、ラムダ式を紹介する。

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

本コンテンツの目次

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

旧バージョン2環境への対応、標準ライブラリ ― Python言語の文法(応用編)


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