Python言語の文法を、コードを書く流れに沿って説明してきた本連載。今回からは、応用的なトピックを取り上げていく。今回は、Python 3文法で書いたコードをPython 2系環境で実行する方法とPython標準ライブラリについて説明する。
ご注意:本記事は、@IT/Deep Insider編集部(デジタルアドバンテージ社)が「deepinsider.jp」というサイトから、内容を改変することなく、そのまま「@IT」へと転載したものです。このため用字用語の統一ルールなどは@ITのそれとは一致しません。あらかじめご了承ください。
本連載では、Python言語の基礎文法を本当に使われる必要最小限のものに絞って説明してきた。よって、これまでの連載内容をマスターしてきたのなら、例えばライブラリ「TensorFlow」の公式チュートリアルのサンプルコードなど、ほとんどのコードを読めるだろう。しかしは、これまでに説明したもの以外の文法もわずかながら使われている。具体的には例えば図17-1(※2018年10月時点の公式チュートリアルより)のように「ラムダ式」や「リスト内包表現」といった、コードがより短く書ける文法などがそれである。
そこで連載を終える前に、今回からの5回は、応用的だがよく使われる文法を、落穂拾いとして簡単に紹介していくことにしよう。
今回は文法の応用トピックとして、Python 2系の環境(※ただし、2020年1月1日よりサポート期間が終了するので、できるだけ利用しないことをお勧めする)でPython 3風の構文を使う方法と、Python標準で利用できるライブラリについて簡単に紹介する。※脚注や図、コードリストの番号は前回からの続き番号としている。
なお、本稿で示すサンプルコードの実行環境については、Lesson 1を一読してほしい。
Lesson 1でも示したように、本連載のすべてのサンプルコードは、下記のリンク先で実行もしくは参照できる。
Lesson 1でも紹介したように、本連載で解説してきたPython 3言語仕様の一部は、Python 2系と互換性がない。ということは、「万が一、Python 2系を使う必要性が発生した場合には、さらにバージョン2も再学習しなければならないのか」という疑問が生じるだろう。しかしそんなことはない。実は、Python 2系の環境でもPython 3的にコードが書ける「逃げ道」が用意されているからだ。
その逃げ道とは、リスト16-1のようにfrom __future__ import xxxというコードにより、__future__モジュールからいくつかのモジュールをインポートすることだ。
# 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」
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行ずつ記載したが、このように,区切りで複数まとめてインポートすることもできる)。
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のように出力される
__future__モジュールでは、この他にもgenerator_stopモジュールなども提供されているが、現時点では不要なので説明を割愛する。
Python 2環境への対応方法の説明は以上である。
さて、話は変わり、次に、Python標準ライブラリに含まれるモジュールについて簡単に紹介しておこう。
Pythonでは、PyPI経由でさまざまなライブラリを導入できることをLesson 2で説明した。だが、素のPython環境にも標準ライブラリが付属しており、OS(オペレーティングシステム)関連や、インターネット関連、CSVファイル関連、pickleと呼ばれる形式でのPythonオブジェクトデータの保存機能といった基本機能が、それぞれモジュールの形で提供されている。例えばOS関連の機能は、osモジュールをインポートすることで利用できる(リスト17)。
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')
# 上記の出力結果は環境により異なるので注意
Python標準ライブラリにどのようなモジュールがあるかは、公式リファレンスを一度眺めてほしい。図17はそのスクリーンキャプチャで、ざっとスクロールしてみると、大量のモジュールが用意されているのが分かる。
今回は、Python 3文法に書いたコードをPython 2系環境で実行する方法を説明し、Python標準ライブラリについて紹介した。次回は、if条件式とand/or/not 論理演算子について紹介する。
Copyright© Digital Advantage Corp. All Rights Reserved.