機械学習入門 vol.3 Pythonの基礎3 関数・クラス・モジュール

本コンテンツは機械学習入門講座を各所でやっている内容の一部を、受講者の皆様の予習・復習のために公開しているものです。対象読者は、Pythonをやったことがほとんどない方やつまづいてしまっている方でも概ね実行できるようになるレベルで書いています。解説は講座でそれなりに詳しくしているため、コードにコメントする以上の説明はあまり記述していません。

各コードはJupyterシリーズやiPythonで記述しながら実行できるように記述しています。

AI/DX/機械学習/Pythonのアドバイザリー、社内研修、セミナー等承っております。
webサイトからお問い合わせください。
[BeeComb Grid株式会社](https://beecomb-grid.co.jp/)

# 機械学習入門記事シリーズ

1. [機械学習入門 vol.1 Pythonの基礎１ 記述とデータ型](https://qiita.com/mychaelstyle/items/500f67b01fda79c215d0) -> 講座第3回に相当
1. [機械学習入門 vol.2 Pythonの基礎2 条件分岐と処理](https://qiita.com/mychaelstyle/items/891dcad83e94f8edd3aa) -> 講座第3回に相当
1. 機械学習入門 vol.3 Pythonの基礎3 関数・クラス・モジュール -> 講座第3回に相当
1. [機械学習入門 vol.4 表（Pandas）の基本操作](https://qiita.com/mychaelstyle/items/96ea9e8c679f908205ab) -> 講座第3回/第4回に相当
1. [機械学習入門 vol.5 グラフ(Seaborn)の基本操作](https://qiita.com/mychaelstyle/items/5acf7fdb1f11ba5478d1) -> 講座第3/4回に相当
1. [機械学習入門 vol.6 回帰 - 線形回帰](https://qiita.com/mychaelstyle/items/a12882a75d348952b1b9) -> 講座第4回に相当
1. [機械学習入門 vol.7 回帰 - ランダムフォレストとパラメータチューニング](https://qiita.com/mychaelstyle/items/48238d70c7602ca14a0c) -> 講座第4回に相当
1. [機械学習入門 vol.8 回帰 - その他の回帰 (k近傍法,ラッソ回帰,リッジ回帰..etc)](https://qiita.com/mychaelstyle/items/fc51cf384b517fb405f8) -> 講座第4回に相当
1. [機械学習入門 vol.9 判別（分類）](https://qiita.com/mychaelstyle/items/34ca447a625c752dbfda) -> 講座第5回に相当
1. [機械学習入門 vol.10 次元削減](https://qiita.com/mychaelstyle/items/69aab0c098dfa1e19e7d) -> 講座第6回に相当
1. [機械学習入門 vol.11 クラスタリング](https://qiita.com/mychaelstyle/items/89d04ce33c3e05d9545c) -> 講座第6回に相当

# 機械学習入門 vol.3 Pythonの基礎3 関数・クラス・モジュール

## 関数と引数

関数は、何度も同じ処理を行う場合や、値を変えるだけで処理が同じ部分を一まとまりにしておいて、後から呼び出すことができる仕組みです。 pythonは関数と作成するときに、`def 関数名`で作成します。

```python
# helloという名前の関数を作成
def hello() :
    print("Hello") # 関数の中の処理は宣言の行から段下げ（インデント）して記述します。

# hello関数を呼び出し
hello() # 関数名を記述するだけで呼び出すことができます。
```
関数は「引数」と言って、値を受け取って処理するように作成することができます。引数は宣言時に作成者が好きな名前で好きな数だけ指定することができます。

```python
# hello関数で、名前を受け取って挨拶の後に名前を表示するように変えてみます
def hello( name ):
    print("Hello " + name)

hello("中島")
```

引数は呼び出すときに引数名を指定して呼び出すことができます。名前付き呼び出しでは引数の順序を気にせず呼び出すことができます。

```python
# hello関数で複数の引数を用意
def hello( name, age ):
    print("Hello " + name + "! You are " + age + " years old!")

# 名前なし呼び出しは引数は順番通り記述
hello("中島","40")
#　名前付き呼び出しは順序は関係ない
hello(age="40", name="中島")
```


Pythonにはあらかじめ様々なモジュールと関数が用意されており、どんな引数で呼び出すかも併せてドキュメントで確認できます。モジュールについては後述します。

# クラス

クラスとは、変数と関数を取りまとめて、値と機能を持った新しいデータ型を作るテンプレートのようなものです。`class クラス名:`で書き始めてインデントしている範囲がクラス内の変数・関数として扱われます。

```python
# 人クラス
class Person:
    # メンバ変数: 名前
    name = None
    # メンバ変数: 年齢
    age  = None
    # コンストラクタメソッド
    def __init__(self, name, age):
        self.name = name
        self.age = age
    # 発言メソッド
    def say(self):
        print("私の名前は" + self.name + "です。")
        print("年齢は %d 歳です。" % self.age)

# 中島の人クラスインスタンスを作成
nak = Person(name="中島", age=45)
# インスタンスのメソッド（関数）を呼び出し
nak.say()
```

# モジュールとパッケージ
Pythonではあるフォルダに配置したpythonプログラムファイルを実行する場合に、import文を使って、そのファイル以外のファイルからプログラムを読み込んで利用することができます。これらの外部プログラムは、自分で作成することもできますし、Pythonの多くの便利な機能を持ったライブラリを利用することもできます。

```python
# モジュールを読み込む
import モジュール名
# モジュールの中の関数やクラスを直接読み込む場合はピリオドで区切って関数名・クラス名を直接指定
import モジュール名.関数名またはクラス名
```

Pythonではファイルをモジュール、フォルダをパッケージと考えて差し支えありません。
以下のようなフォルダ構成でPythonのプログラムファイルがパソコンに配置されている場合

```
+-- main.py
+-- mypackage/
     +-- mylib.py
          +-- add関数はmylib.pyに記述されている
```
読み込み方は下記のようになります。

```python
# このようにつなげてimportすることができます。
import mypackage.mylib
# この読み込み方をする場合は、使う時もmypackage.mylib.（関数またはクラス名）などと
# フルに記述する必要があります。
# 以下はmymathファイルに記述されているadd関数を実行する場合の記述です
mypackage.mylib.add(x)
```

from句を使って、プログラム中で目的のクラスや関数だけ書けば利用できるように読み込むことができます。通常はこちらを利用することが多いです。

```python
# パッケージ・モジュールまでをformで記述し、importに直接関数名を記述
from mypackage.mylib import add
# add関数を直接使うことができます
add(x)
```

## モジュール・パッケージの自動探索について

あなたが書いたプログラムのファイルと同じフォルダ内にfrom/import句で記述されているパッケージやモジュールが見つからなかった場合、Pythonランタイムは、Pythonのインストールフォルダと、標準のライブラリフォルダ内に指定されたパッケージやモジュールがあるかを探し、それでもなければエラーにするという処理を行います。

次回はデータの扱いと表についてPandasの基本操作をまとめます。

# 機械学習入門記事シリーズ

1. [機械学習入門 vol.1 Pythonの基礎１ 記述とデータ型](https://qiita.com/mychaelstyle/items/500f67b01fda79c215d0) -> 講座第3回に相当
1. [機械学習入門 vol.2 Pythonの基礎2 条件分岐と処理](https://qiita.com/mychaelstyle/items/891dcad83e94f8edd3aa) -> 講座第3回に相当
1. 機械学習入門 vol.3 Pythonの基礎3 関数・クラス・モジュール -> 講座第3回に相当
1. [機械学習入門 vol.4 表（Pandas）の基本操作](https://qiita.com/mychaelstyle/items/96ea9e8c679f908205ab) -> 講座第3回/第4回に相当
1. [機械学習入門 vol.5 グラフ(Seaborn)の基本操作](https://qiita.com/mychaelstyle/items/5acf7fdb1f11ba5478d1) -> 講座第3/4回に相当
1. [機械学習入門 vol.6 回帰 - 線形回帰](https://qiita.com/mychaelstyle/items/a12882a75d348952b1b9) -> 講座第4回に相当
1. [機械学習入門 vol.7 回帰 - ランダムフォレストとパラメータチューニング](https://qiita.com/mychaelstyle/items/48238d70c7602ca14a0c) -> 講座第4回に相当
1. [機械学習入門 vol.8 回帰 - その他の回帰 (k近傍法,ラッソ回帰,リッジ回帰..etc)](https://qiita.com/mychaelstyle/items/fc51cf384b517fb405f8) -> 講座第4回に相当
1. [機械学習入門 vol.9 判別（分類）](https://qiita.com/mychaelstyle/items/34ca447a625c752dbfda) -> 講座第5回に相当
1. [機械学習入門 vol.10 次元削減](https://qiita.com/mychaelstyle/items/69aab0c098dfa1e19e7d) -> 講座第6回に相当
1. [機械学習入門 vol.11 クラスタリング](https://qiita.com/mychaelstyle/items/89d04ce33c3e05d9545c) -> 講座第6回に相当

AI/DX/機械学習/Pythonの社内研修、セミナー等承っております。
webサイトからお問い合わせください。
[BeeComb Grid株式会社](https://beecomb-grid.co.jp/)