PHPしか知らない僕がPythonを少し触ってみたよ 〜アーマードじゃないモジュール〜

この記事はだいぶ前に書かれたものなので情報が古いかもしれません
アーマードモジュールことネオ・グランゾン

この記事を三行にまとめると

基本的には「import」を使って読み込みます
「from」というやつを使って読み込むこともできます
スーパーロボット大戦のアーマードモジュールを思い出す
コーディングをしていると、date系の関数を使ったり正規表現を使ったり、四捨五入やら少数の切り上げや切り捨てをする機会がたびたびあると思います。

PHPだったらdate()やらpreg_match()やらをそのまま使えば問題ないのですが、Pythonの場合、そういった処理を行うにはモジュールを読み込む必要があります。

なので今日はそのモジュールの読み込み方をちょいと見てみましょう。



import

基本的には「import」を使って読み込みます。

例えば少数の切り上げや切り捨てを行う「ceil」や「floor」を使えるようにしてみましょう。

import math
i = 1.5
print(math.ceil(i))
print(math.floor(i))

ceilやfloorは「math」というモジュールの中にあるので、そいつを読み込んでやれば使えるようになります。

複数のモジュールをまとめてインポートする場合はコンマで区切ります。

import math, datetime
i = 1.5
print(math.ceil(i))
print(datetime.date.today())

「today()」というのは今日の日付を出力する関数です。ちょっとややこしいのですが、「datetime」というモジュールの中にある「date」というクラスの中にある関数って感じです。



fromを使う

importとの組み合わせで「from」というやつを使って読み込むこともできます。

僕もまだちゃんと理解できてないのでどう説明するのが適切かが微妙なのですが……モジュールの中から特定のものだけを読み込む、みたいなニュアンスですかね。

例えばさっきのmathというモジュールの中にはいろんな関数があるわけですが、その中にあるceilだけ読み込みたい場合。

from math import ceil
i = 1.5
print(ceil(i))

fromを使って読み込んだ場合は、「math.ceil()」ではなく「ceil()」のように書き方が変わります。

これでceilだけが使える状態になります。floorは使えない。使おうとするとエラーになるので、両方使いたい場合はやはりコンマで。

from math import ceil, floor
i = 1.5
print(ceil(i))
print(floor(i))

ちなみにfromの方にはコンマ区切りが使えないっぽいです。

from math, datetime import ceil, date
i = 1.5
print(ceil(i))
print(date.today())

こういう場合は一つずつ読み込まないとダメみたいですね。

from math import ceil, floor
from datetime import date
i = 1.5
print(ceil(i))
print(floor(i))
print(date.today())



モジュールの中身を調べる

必要に応じてモジュールをインポートするのは良いとして、じゃあmathとかdatetimeの中にはどんな関数があるのん? って疑問が沸くこともあるかもしれない。少数の切り上げや切り捨てができるのは分かったが、平方根や三角関数を使いたい場合もmathモジュールで良いのか? みたいなね。

ググればわりと簡単に情報が出てくるのでその都度調べれば何とかなるのですが、自分でコードを書いてモジュールの中身を調べる方法もあります。

方法としては主に二通りのやり方があります。

一つは「help()」という関数を使う。

import math
help(math)

これでmathというモジュールの中にある関数の一覧などが表示されます。かなーり長いんで省略して一部を書き出すとこんな感じ。

Help on built-in module math:

NAME 
math

DESCRIPTION 
This module is always available. It provides access to the 
mathematical functions defined by the C standard.

FUNCTIONS 
acos(...) 
acos(x) 


・・・中略・・・


sqrt(...) 
sqrt(x) 

Return the square root of x. 

tan(...) 
tan(x) 

Return the tangent of x (measured in radians). 

tanh(...) 
tanh(x) 

Return the hyperbolic tangent of x. 

trunc(...) 
trunc(x:Real) -> Integral 

Truncates x to the nearest Integral toward 0. Uses the __trunc__ magic method.

DATA 
e = 2.718281828459045 
inf = inf 
nan = nan 
pi = 3.141592653589793

FILE 
(built-in)

中略の後ろ辺りに「sqrt」とか「tan」という文字がありますね。つまりmathというモジュールの中には「sqrt」や「tan」という関数があるぞってことになり、「math.sqrt()」や「math.tan()」が使えることを意味します。



もう一つの調べ方は「inspect」というモジュールを使うやり方です。

import math, inspect
print(inspect.getmembers(math))

inspectの「getmembers()」という関数にモジュール名を渡してあげれば、そのモジュールの中身を見ることができます。

ちなみにmathを見た場合はこんな感じ。こっちもちょっと長いんで途中を省略して一部だけ書き出します。

[('__doc__', 'This module is always available. It provides access to the\nmathematical functions defined by the C standard.'), ('__loader__', <class '_frozen_importlib.BuiltinImporter'>), ('__name__', 'math'), ('__package__', ''), ('__spec__', ModuleSpec(name='math', loader=<class '_frozen_importlib.BuiltinImporter'>, origin='built-in')), ('acos', <built-in function acos>), ('acosh', <built-in function acosh>), ・・・中略・・・('sqrt', <built-in function sqrt>), ('tan', <built-in function tan>), ('tanh', <built-in function tanh>), ('trunc', <built-in function trunc>)]

helpに比べるとパッと見では何のこっちゃかよく分かりませんが、見ると「sqrt」やら「tan」って文字があるのが分かると思います。例えば「(‘sqrt’, <built-in function sqrt>)」ってのは、sqrtという組み込み関数があるぞってことを示してます。

組み込み関数だけを調べたいような場合は、「getmembers()」の第二引数に値を指定してやることで結果を絞り込めます。

import math, inspect
print(inspect.getmembers(math, inspect.isbuiltin))

どんな値を渡すとどんな絞り込みができるかはここ(↓)を見るとよいよ。

inspect.getmembers



さっきのdatetimeの中にあるdateクラスなんかを調べる場合も、「isclass」を使えば絞り込みが可能です。

import datetime, inspect
print(inspect.getmembers(datetime, inspect.isclass))

//出力結果
[('date', <class 'datetime.date'>), ('datetime', <class 'datetime.datetime'>), ('time', <class 'datetime.time'>), ('timedelta', <class 'datetime.timedelta'>), ('timezone', <class 'datetime.timezone'>), ('tzinfo', <class 'datetime.tzinfo'>)]

dateというクラスがあるのが分かりますね。

さらにdateの中にある組み込み関数を調べてみます。

import datetime, inspect
print(inspect.getmembers(datetime.date, inspect.isbuiltin))

//出力結果
[('__new__', <built-in method __new__ of type object at 0x9d9cc0>), ('__subclasshook__', <built-in method __subclasshook__ of type object at 0x9d9cc0>), ('fromordinal', <built-in method fromordinal of type object at 0x9d9cc0>), ('fromtimestamp', <built-in method fromtimestamp of type object at 0x9d9cc0>), ('today', <built-in method today of type object at 0x9d9cc0>)]

todayがありました。



helpでも同じように調べることができますが、やっぱりながーい出力結果が返ってくるのでここでは省略します。真実は自分の目で確かめてみてくだせえ。

import datetime
help(datetime)
help(datetime.date)






今日は基本的な読み込みについてしか触れませんでしたが、別ファイルを読み込むような場合(PHPでいうrequire的な)もこのimportは活躍するので、それはまた今度やりましょう。

dateとかはよく使うような気がするし、明示的にモジュールを読み込まなくても最初から使える方が便利な気もするのですが、必要な時だけ読み込むようにすることで、メモリの消費とかを抑えたりできるってことなんですかね?

全然関係ないけど、モジュールって聞くとどうしてもスーパーロボット大戦のアーマードモジュールを思い出す。



その他のPythonを少し触ってみたの記事はこちら
前書きと索引的な
 もしかしたら何か関連しているかも? 
 質問や感想などお気軽にコメントしてください