ライブラリ？パッケージ？モジュール？ここらへんのややこしいことを初心者なりにまとめてみた

## はじめに
- **ライブラリ、パッケージ、モジュールについてまとめます**
- **インポートの方法についてscikit-learnを例に解説と考察を行います**

※プログラミング関係の内容を他にも投稿していますので、よろしければ[こちら](https://qiita.com/oki_kosuke/items/34b1071224953776c211#%E6%8A%95%E7%A8%BF%E4%B8%80%E8%A6%A7)の一覧から他の投稿も見て頂けますと幸いです。

### 環境
- conda 4.8.3
- python 3.8.3

## 用語の整理
**ライブラリ＞パッケージ＞モジュール＞クラス、関数**という関係です。
※ただし、ライブラリには正確な定義はない

**「ライブラリ」**
ライブラリとは、いくつかのパッケージをまとめて一つのライブラリとしてインストールできるようにしたものです。具体的な定義はなく、モジュールのことをライブラリと呼んだり、パッケージのことをライブラリと呼んだりと様々な使用法があるようです。
ライブラリには以下の２種類があります。

　・標準ライブラリ
　…Pythonにあらかじめ標準で用意されているライブラリ
　　そのまま何もせずに使える「組み込み関数（例：print）」と
　　事前にimport文で読み込みが必要なもの（例：csv）
　　標準ライブラリは次のサイトで確認可能
　　https://docs.python.org/ja/3/library/

　・外部ライブラリ
　…インストールで追加して、import文で呼び出して仕様（例：pckle）
　　外部ライブラリは以下のPyPI(パイパイ)で検索可能
　　https://pypi.org/

**「パッケージ」**
モジュールをいくつか集めてまとめたものがパッケージです。

**「モジュール」**
モジュールとは、Pythonのファイル（.py）の事です。モジュールには関数やクラスが定義されています。

**「クラス」**
クラスの中にメソッドが定義されており、クラスを束ねたものがモジュール

（関数とクラスの違いはまだあまり理解できていないので、今後勉強します…）


## インポートの方法
以下のいずれかの方法でインポートが可能です。

```
import パッケージ(モジュール名)
from パッケージ(モジュール名) import オブジェクト名(クラス名, 関数名)
import パッケージ.モジュール名
from パッケージ.モジュール名 import オブジェクト名(クラス名, 関数名)
```

例えば、sklearnの線形回帰を実行する際は以下のインポート文を書きます。

```python
from sklearn.linear_model import LinearRegression
```

<br>

別名をつけてインポートする際には以下のいずれかのようにasを使います。

```
import パッケージ(モジュール名) as 別名
from パッケージ(モジュール名) import オブジェクト名(クラス名, 関数名) as 別名　※オブジェクト自体に別名がつく
```

例として、よく目にするnumpyのインポート文を書いてみます。

```python
import numpy as np
```

### sklearnのLinearRegressionのインポートを考えてみる
上で述べたように、次のインポート文でインポートが可能です。

```python
from sklearn.linear_model import LinearRegression
```

また、次の2つでもエラーなく実行されます。

```python
import sklearn.linear_model
```

```python
from sklearn import linear_model
```

しかし、次のインポート文ではエラーになります。

```python
import sklaern
```
```:出力結果
ModuleNotFoundError                       Traceback (most recent call last)
<ipython-input-1-c019031db95a> in <module>
----> 1 import sklaern

ModuleNotFoundError: No module named 'sklaern'
```

[こちら](https://qiita.com/hiroyuki_mrp/items/4b7102709e6582b9dd15)でも上記のインポート文ではエラーが起こると記載があります。sklaernというパッケージ自体はインポートできないのかな？と推測しますが、イマイチ腑に落ちていません…以下の実行結果からは、"sklearn"も"sklearn.linear_model"もどちらも同じモジュールであると読み取れます。（**詳しい方、教えてください。**）

```python
import sklearn.linear_model
sklearn
```
```:出力結果
<module 'sklearn' from 'C:\\Users\\ユーザー名\\anaconda3\\lib\\site-packages\\sklearn\\__init__.py'>
```

```python
import sklearn.linear_model
sklearn.linear_model
```
```:出力結果
<module 'sklearn.linear_model' from 'C:\\Users\\ユーザー名\\anaconda3\\lib\\site-packages\\sklearn\\linear_model\\__init__.py'>
```

## まとめ
図で表すと以下のようになると理解しました。

![python_memo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1057114/5dfc6e15-1f18-9fba-c13a-ce2ef7b131b6.png)

### 参考
- [あまり基礎から教えてもらうことがないpythonのimportについて。モジュール？パッケージ？クラス？](https://qiita.com/hiroyuki_mrp/items/4b7102709e6582b9dd15)
- [AI-interのPython3入門](https://ai-inter1.com/python-module_package_library/)
- [Snow Tree in June](https://snowtree-injune.com/2019/07/01/word-a0046-48-module-package-library/)
- [Python初心者の備忘録](]https://py-memo.com/python/module-package-library/)
- [鎖プログラム](https://pg-chain.com/python-module-class-method)
- [わくわくBank.](https://www.wakuwakubank.com/posts/260-python-basic-function/)