python3 入門　モジュール

# スタンドアローンプログラム
自分で書いたコードをモジュールのように使っていくようなことをスタンドアローンプログラムと言います。これからこのようなコードをうってください。

```py
print('I am here')
```
これをtest_code.pyで保存してください。次にterminalを開いてこのモジュールが使えるのかをやっていきます。

```py
python test_code.py
# 実行結果
I am here
```
こうなっていれば自分で作ったモジュールを使うことができます。

# そもそもモジュールって何なん？？
モジュールというのはpythonのコードをまとめた集合体（ファイル）です。なぜモジュールを使ったらいいのかというと「入門　python３」の例で考えてみよう。あなたはこれから当たる可能性が少ない天気予報士になってもらう。このモジュールはあとで説明するが、ランダムでpossibilitiesから天気を予想するものだ。

```py
def get_description():
    from random import choice
    possibilities = ['rain', 'snow', 'sleet', 'sun']
    return choice(possibilities)
```
天気予報士は毎日天気を予測しなきゃいけない。しかしこのコードを毎日書いていくのは非効率ではないだろうか。この時に使われるのがモジュールである。このモジュールをreport.pyで保存する

```py
import report
weather = report.get_description()
print("Today's weather is ", weather)
```
これらのコードはまた後ほど説明する。こレだけを書くだけで済むのである。このようにして描かなければ

```py
def get_description():
    from random import choice
    possibilities = ['rain', 'snow', 'sleet', 'sun']
    return choice(possibilities)
weather = get_description()
print("Today's weather is ", weather)
```
これはとても非効率であることがわかる。よってモジュールが使われる。

# モジュールとimport文
モジュールを読み込みたいときは先ほどのようにimportを使えば読み込みができるようになる。

```py
def add_int(a, b):
    return a + b
```
これをadd_loveで保存する。

```py
import add_love
add_need = add_love.add_int(3, 5)
print(add_need)
```
ここでポイントなのはimport先である。自分が作った関数をimportしてもダメであって、それが入っているファイルをimportすることが大切である。ここでもっと簡単にモジュールを書き換えてみよう。例えば「search_today_weather」というモジュールを作成したとする。これを関数を呼び出す時に毎回かかなきゃいけないのは大変である。よって、asというものが使われる。

```py
import search_today_weather as stw
```
「stw」はsearchのsとtodayのtとweatherのwをとった簡略化したものである。このようにしてモジュールは簡略化することが可能になる。次に必要な関数だけ欲しい時に使える「from　import」を使ってみよう。

```py
from add_love import add_int
```
とするだけでadd_loveのadd_intだけを読み込むことが可能になる。

# 標準ライブラリ
pythonにはたくさんの役に立つことをしてくれる便利なモジュールがある。それは自分で定義しなくても読み込むだけで可能になる。そのようなものを読み込むにはモジュール公式ドキュメントや標準ライブラリチュートリアル

## 代表的なモジュールの説明
###Counter()による要素の計算
Counterはそれぞれの値の個数を求めることができる。

```py
from collection import Counter
breakfast = ['spam', 'spam', 'egg', 'spam']
breakfast_counter = Counter(breakfast)
breakfast_counter
# 実行結果
Counter({'spam': 3, 'egg': 1})
```
これに補足するような形でmost_common()という関数もある。この関数は値が多く入っているものから順番にリストとして出してくれる。そして引数に根を入れれば上から順番にその個数分の要素がもらえる。例えばmost_common(1)とすると、１番数の入っている値を取り出してくれる。

### setdefault()とdefaultdict()
setdefault()関数は辞書でいうキーがなければ辞書に入る値を全ていれられることができる。

```py
food = {'Pasta': 3, 'Pizza': 1}
yakiniku = food.setdefault('Yakiniku': 2)
yakiniku
# 実行結果
2
print(food)
{'Pasta': 3, 'Yakiniku': 2, 'Pizza': 1}
```
しかし元からあったキーを別の値に変えようとしてもそれは変更することができない。

```py
food = {'Pasta': 3, 'Pizza': 1}
yakiniku = food.setdefault('Pizza': 5)
pizza
# 実行結果
5
print(food)
{'Pasta': 3, 'Pizza': 1}
```
このように値は変更しない。defaultdict()は例外を防ぐという目的もある。もしバリューが設定しなければdefaultdict()に入っているものをそのまま使える。

```py
def no_image():
    return "There are nothing"
bestiary = defaultdict(no_image)
bestiary['A'] = 'Art'
bestiary['B'] = 'Bool'
print(bestiary['A'])
'Art'
print(bestiary['B'])
'Bool'
print(bestiary['C'])
'There are nothing'
```
Cには何もいれてないがキーには何かが入っている。これはdefaultdict()の効果です。

# OrderedDict()
このモジュールは辞書に登録した順番で取り出していく

```py
languages = {
'France': 'Franch',
'Japan': 'Japanese',
'Spain': 'Spanish',
}
for language in languages:
    print(language)
# 実行結果
Spain
Japan
France


from collections import OrderedDict
languages = OrderedDict({
'France': 'French',
'Japan': 'Japanese',
'Spain': 'Spanish',
})
for language in languages:
    print(language)
# 実行結果
France
Japan
Spain
```
このように順番で返ってくる

## itertoolsによるコード構造の反復処理
for..inで呼び出されると呼び出しの間もその状態を覚えている。chain（）は引数全体が一つのイテラブルになっている。

```py
import itertools
for item in tertools.chain([1, 2], ['a', 'b']):
    print(item)
# 実行結果
1
2
a
b
```

# pprint()
いつもはprintを使って色々なコードを出力してきた。しかし、大きな辞書などのものは結果の見栄えが悪くなっている時がある。その時に使われるものがpprint（）である。

```py
from pprint import pprint
quotes = OrderedDict([
('A': 'Art'), 
('P': 'Play'), 
('W': 'Write')]) 
```
これをprintでやってみたらどうだろうか

```py
print(quotes)
# 実行結果
OrederedDict([('A': 'Art'), ('P': 'Play'), ('W': 'Write')]) 
```
一方pprintだとどうだろうか

```py
pprint(quotes)
{'A': 'Art', 
'P': 'Play', 
'W': 'Write'}
```

>最後に
もしここが違う！とかここはもっとわかりやすく簡単にできる。などありましたら教えてください！！