ライブラリってなんですか?
図書館じゃないですよね?
確かにエンジニアの先生の説明だと馴染みがない横文字ばっかりで辛いことがあるね。
ここではモジュール、パッケージ、ライブラリといったpythonのファイルの構造をわかりやすく説明していきたいと思います。
1.モジュール
モジュールとは.pyのつくファイル
関数やクラスといった機能の詰め合わせ
ライブラリという言葉を調べると、モジュール、パッケージという言葉が出てきたりして詰まってしまうことがあります。
ここではモジュールという言葉を説明します。
pythonはプログラムを書いたテキスト(スクリプト)を.pyという形式で保存します。
この1つ1つがモジュールです。
一般には.pyファイルには関数やクラスが記載されています。
代表的なモジュールos
osはオペレーティングシステムに関する機能をもったモジュールです。
pythonをインストールしたときにたくさん入るファイルのうち
「os.py」
というファイルにかかれています。
このosはpythonを起動した時から使えます。
いくつかosを使って関数を呼び出してみましょう。
import os
osの機能をインポートします。
これでosの機能が使えるようになります。
os.getcwd()
自分のいるフォルダの場所を出力する(current working directory)
os.getcwd()
‘/Users/programming/Desktop’
他にも
os.mkdir(フォルダ名)
今いるフォルダにフォルダを作成する
os.chdir(フォルダ名)
フォルダ名に移動する
などができます。
os.getcwd()
# '/Users/programming/Desktop'
os.mkdir('test')
# testというフォルダを作成
os.chdir('test')
# 作成したtestフォルダに移動
os.getcwd()
‘/Users/programming/Desktop/test’
となります。
このosのように
関数などの機能を含んだ.pyファイルを
モジュールとよびます。
2.標準ライブラリ
標準ライブラリとはpythonをインストールした時から入っている一連の機能
代表的なものはos.py, shutil.py, optparse.pyなど
ライブラリとはいろいろ便利な機能が入っているかたまりです。
library(英語) : 図書館、書庫
という意味ですが、
ここでは図書館というよりは書庫に近いイメージです。
モジュールを本として、関数やクラスをその本の1ページ1ページだとすると、
ライブラリは本棚にあたります。
前項の「os」のように、
pythonをインストールすると最初から使える機能がたくさんあります。
これらを標準ライブラリといいます。
自分の家に最初からある本棚のようなものですね。
本棚から本をとってきてその中の関数を使用するイメージ
pythonの標準ライブラリはドキュメントのページにまとめられています。
pythonの標準ライブラリの一覧 (ドキュメントのページ)
3.外部ライブラリ
外部ライブラリとは一連の機能を持った.pyの集合
インストールする必要がある
numpy, matplotlib, pandasなど
pythonにもともと入っていないものです。
「サードパーティによるライブラリ」
などと言われます。
インストールしたばかりのpythonだとimportできません。
データ解析によく使うものを紹介しながら説明します。
① numpy(数値計算ライブラリ)
数値計算でよく使用されるライブラリです。
ベクトル計算、行列計算といった数値計算を行うモジュール(.pyファイル)が入っており、
座標計算や機械学習、ディープラーニングにも使用されます。
pythonをインストールしたばかりの頃はnumpyは使用できません。
numpyはターミナルで
pip install numpy
としてインストールできます。
pipが使えないのであればインストールする必要があります。
ちなみにpython導入時にanacondaをインストールするとまとめてインストールされています。
「外部ライブラリをインストール」する
というのは、さきほどの例えで続けると
「同系統の種類の本(モジュール)の入った本棚(ライブラリ)を買ってくる」
ようなものです。
標準ライブラリに加え、本棚を購入してくる
このまま本棚においていては使用できないのでimportする必要があります。
numpyの行列計算の例を出します。
[1, 2, 3]というベクトルをaに代入し、
ベクトルの長さを求めます。
import numpy as np
#ライブラリ(本棚)をnpという名前で作業スペースに持ってくる
a = np.array([1, 2, 3])
# ベクトルをaに代入
print(np.linalg.norm(a))
#npライブラリ(本棚)のlinalgモジュール(本)のnormという関数(ページ)で長さを計算
3.7416573867739413
numpyをnpという名でインポート
上ではライブラリnumpyをインポートしていますが、
モジュールlinalgをインポートする事もできます。
from numpy import linalg
a = [1, 2, 3]
linalg.norm(a)
3.7416573867739413
※ちなみにここではimportの説明のためにこのような書き方をしていますが、
ただのリスト[1, 2, 3]にnumpyの関数を無理に使用するのは推奨はできません。
この流れは以下のようなイメージです
本棚の本だけを作業スペースにもってくるイメージ
同じ意味を
import —-
の形式でも書けます。
import numpy.linalg
a = [1, 2, 3]
numpy.linalg.norm(a)
ここでは
numpy.linalg
と明示する必要があります。
さらに関数だけをインポートすることもできます。
from numpy.linalg import norm
a = [1, 2, 3]
norm(a)
として計算もできます。
関数(ページ)だけを作業スペースにもってくる
from ライブラリ import *
ワイルドカード *を使うと、一気にインポートできます。
from ライブラリ import *
「import ライブラリ」で使用できるモジュールをすべてimport
from numpy import *
a = [1, 2, 3]
linalg.norm(a)
3.7416573867739413
とlinalgが使えます。
「from ライブラリ import *」 は非推奨
import * をすると、ライブラリのモジュールを多くつかえるようになりますが、
どのライブラリからのものかわからなくなります。
そのためpythonでこの書き方は推奨されていません。
import ライブラリ
ライブラリ.モジュール
と明示して使用するようにしましょう。
② matplotlib(グラフ描画のライブラリ)
もう一つ
グラフを書くライブラリ「matplotlib」を例にして説明します。
matplotlibも同様に外部ライブラリのため、
pip install matplotlib
でインストールする必要があります。
matplotlibの中の
pyplot.pyというモジュールの中に
scatter() という点をプロットする関数と
show() というグラフを書く関数があります。
matplotlibのフォルダ構造
def scatter(
x, y, s=None, c=None, marker=None, cmap=None, norm=None,
vmin=None, vmax=None, alpha=None, linewidths=None, verts=None,
・
・
・
def show(*args, **kw):
“””
Display a figure.
When running in ipython with its pylab mode, display all
figures and return to the ipython prompt.
・
・
これらの関数を使って
x = [1,2,3,4,5,6]
y = [3,4,5,6,7,8]
のグラフを書くときは
import matplotlib.pyplot as plt
#maplotlibというライブラリのpyplotというモジュールをpltとして使用する
x = [1,2,3,4,5,6]
y = [3,4,5,6,7,8]
plt.scatter(x, y)
#plt(matplotlib.pyplot)というモジュール内のscatterという関数を利用してグラフにプロット
plt.show()
#pltのshow()をつかってグラフを描く
とするとグラフが描画されます
次のような記述でも機能します。
from matplotlib import pyplot as plt
x = [1,2,3,4,5,6]
y = [3,4,5,6,7,8]
plt.scatter(x, y)
plt.show()
numpy.linalgと同じようにpyplotの関数をimportしても機能します。
from matplotlib.pyplot import scatter
from matplotlib.pyplot import show
x = [1,2,3,4,5,6]
y = [3,4,5,6,7,8]
scatter(x, y)
show()
関数単体で持ってくるのは可能ではありますが、numpyもpyplotも関数一つずつを引っ張ってくるとimportの行が無限に長くなってしまいます。
本のページをいっぱい切って持ってくるとどこからとったかわからなくなるのと同じです。
importは機能や出どころがわかりやすいようにしましょう。
4.パッケージ
パッケージとは、モジュール(.pyのファイル)を複数集めてある機能をもたせたもの
モジュールが本とすると、本のシリーズにあたる
1つの目的で機能を役割分担させ、複数の.pyを作ることがあります。これをひとくくりにしたものがパッケージです。
ライブラリと同じ意味で用いられていることもあります。
本のシリーズのようなものです。
たとえば
自分でなにかを解析したいときに、
- データ構造を書いた.pyファイル
- データ計算用の.pyファイル
- データ視覚化の.pyファイル
を分けて親フォルダにいれる。
という使い方をすることがあります。
これらのまとまりがパッケージです。
ライブラリ:本棚
パッケージ:何巻かセットのシリーズ
モジュール:本
関数やクラス:ページ
すべてのファイルが
ライブラリ > パッケージ > モジュール > 関数
の構造をとっているわけではありません。
ライブラリ > モジュール > 関数
の構造のものもたくさんあります。
例えばnumpyのlinalgは
numpyフォルダ > linalgフォルダ > linalg.py
となっていますが、matplotlibのpyplotは
matplotlibフォルダ > pyplot.py
という構造をとります。
numpyとmatplotlibはどちらもライブラリと呼ばれます。
-
ここでは
- ライブラリとパッケージ
- モジュール
- 関数とクラス
の違いがわかっていればいいと思います。
5.importの細かい話(参考程度)
matplotlib.pyplotができません。
ちょっと込み入った話になります。
import numpy as np
a = np.array([1, 2, 3])
print(np.linalg.norm(a))
3.7416573867739413
は機能しますが、
import matplotlib
x = [1, 2, 3]
y = [4, 5, 6]
matplotlib.pyplot.scatter(x, y)
AttributeError: module ‘matplotlib’ has no attribute ‘pyplot’
ではエラーになります。
ちなみに
import matplotlib.pyplot
x = [1, 2, 3]
y = [4, 5, 6]
matplotlib.pyplot.scatter(x, y)
は機能します。
同じようにライブラリをインポートしているのになんででしょう。
ライブラリをimportすると読み込まれる__init__.py
「import matplotlib」ではpyplotは使えない
import ライブラリ
とすると、ライブラリのフォルダ内の
__init__.py
というファイルが読み込まれます。
numpyの__init__.pyには
・
・
from . import linalg
・
・
「同じフォルダからlinalgをインポートする」
という記述が入っています。
一方
matplotlibのフォルダ内の__init__.pyで
import pyplot
はありません。
そのため、
numpyでは初めからnumpy.linalgのモジュールは使用できますが、
matplotlibでは
matplotlib.pyplotを明示してインポートしないと使用できない
というわけです。
複数のモジュールを自分で管理する時に自分で記述する必要が出てきます。
numpyのlinalgフォルダとlinalg.py
もう一つ細かい点を見ると、
matplotlibではmatplotlibのフォルダの下にpyplotがあり、scatterなどの関数があります
matplotlibフォルダ > pyplot.py > scatter関数、show関数
numpyでlinalg.pyは
numpyのlinalgというフォルダの中にあります。
numpyフォルダ > linalgフォルダ > linalg.py > norm関数
となっているわけです。
そのため、
from numpy.linalg.linalg import norm
a = [1, 2, 3]
norm(a)
3.7416573867739413
としても機能します。
なぜ
import numpy as np
np.linalg.norm(a)
が機能するかというと
linalgフォルダの__init__.py
に
from .linalg import *
#同フォルダのlinalg.pyのすべての関数、クラスをインポート
との記載があるからです。
numpyをインポート
↓
numpyの__init__.pyにlinalgをインポートするように書かれている
↓
linalgの__init__.pyに同フォルダの.linalgの関数をlinalg宣言なしに使えるように書かれている
↓
numpy.linalg.normが機能する
というわけです。
よく使うライブラリ、モジュールのインポートは
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import tensorflow as tf
などです。
この辺をインポートするときはいちいちモジュールとの関係を意識せずに使っています。
それでも問題はありません。
6.importについての教材
importの構造を勉強したいのであれば
UdemyでのPython講座
「Python 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイルを学ぶ」がおすすめです。
このシリーズの68.「importとas」(2021年8月現在)
でimportと__init__.pyの構造がわかりやすく述べられています。
これを理解することでライブラリ、モジュール、関数の位置関係がとてもわかりやすくなります。
プロのエンジニアなのに非エンジニアにここまでわかりやすく、短時間でレクチャーできるなんて素晴らしいですね。
この講義ではPython全般の機能に関しても非常に多岐にわたってわかりやすく解説されています。
Udemyはセールをやっている期間があるので、その時期にあたったら気軽に受講してみるのもよいと思います。
↓ 外部リンク UdemyのPython人気講座
現役シリコンバレーエンジニアが教えるPython 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイル
- モジュールは.pyファイルで関数やクラスの集まり(本)
- パッケージはモジュールを機能ごとに集めたもの(本のシリーズ)
- ライブラリはモジュールやパッケージの集まり(本棚)
- インポートはライブラリ・パッケージ・モジュールどの単位でもできる
- フォルダ全体がインポートされるわけではないので注意(__init__.py)
- まずはインポートのパターンを覚えてしまうこと
いきなり大掛かりなWebアプリを作ろうしても尻込みしてしまいます。
本棚を完成させようとするようなものです。
1ページの関数でもとても有用だったりするので、少しずつ書いてみましょう。
補足:osに関して
ここから先は補足なので、ライブラリ、パッケージ、モジュールが大体わかったら読み飛ばしてもらってよいです。
os.pyの入ってるフォルダ
これらのモジュールは先程のosがあったフォルダに含まれている
.pyファイルに入っています。
os.pyがどこにあるかというと、
print(os)
module ‘os’ from ‘/opt/anaconda3/lib/python3.7/os.py’
で出力されます。私の場合は
‘/opt/anaconda3/lib/python3.7’
というフォルダの
os.py
というファイルに書かれています。
同じフォルダにあるファイルを表示します。
import os
print(os)
module ‘os’ from ‘/opt/anaconda3/lib/python3.7/os.py’
os.listdir('/opt/anaconda3/lib/python3.7/')
#os.listdir(フォルダ)でフォルダ内のファイルを出力
[‘zipfile.py’, ‘shutil.py’, ・・・・・・・・, ‘abc.py’, ‘runpy.py’, ‘_bootlocale.py’]
と無数のファイルがでてきます。
この中で.pyとなっているのが、標準ライブラリの中のモジュールです。
os.py, optparse.py, shutil.py
などよく使う機能があります
osの中身
標準ライブラリで説明したosモジュールですが、
os.pyの中には
def getcwd()
・
・
def chdir()
・
・
のような使用関数の定義が見当たりません。
これはos.pyをインポートした時点で
posixというモジュールを読み込んでおり、これを通じて
getcwd()
chdir()
などを使用しています。
posixですが、pythonのDocumentationページには
このモジュールを直接インポートしてはいけません。 その代わりに、このインターフェースの ポータブル 版である os モジュールをインポートしてください。 Unix では、os モジュールは posix インターフェースのスーパーセットを提供しています。非 Unix オペレーティングシステムでは、 posix モジュールは利用できませんが、その一部分は os インターフェースを通して常に利用可能です。
とあります。
ちなみにmacでは
import posix
posix.getcwd()
‘/Users/programming’
としても同じ結果が得られますが、
「直接インポートしてはいけません。」
と言われているので
import os
os.getcwd()
で使用するようにしましょう。