関数, クラス, モジュールで処理をまとめる

Pythonで処理をまとめる方法について解説していきます。「組み込み関数」「モジュール」「パッケージ」の違いを理解してコーディングできるようになると良いと思います。

関数

def文 で関数を定義します。

def add(x, y):
    return x + y


print(add(2, 5))
7

デフォルト

デフォルト値を指定してみます。

def add(x, y, z=2):
    return x + y + z


# キーワード引数を指定。順番の考慮が不要
print(add(y=2, x=5))
9

可変長引数

タプルとして受け取る

def add(x, y, *args):
    print(args)
    z = 0
    for i in args:
        z += i
    return x + y + z


print(add(2, 5, 1, 1, 1))
(1, 1, 1)
10

辞書として受け取る

def add(x, y, **kwargs):
    print(kwargs)
    z = 0
    for i in kwargs.values():
        z += i
    return x + y + z


print(add(2, 5, z1=1, z2=2))
{'z1': 1, 'z2': 2}
10

クラス

class MyClass:

    # コンストラクタ
    def __init__(self, x, y):
        self.x = x
        self.y = y

    # メソッド
    def add(self):
        print(self.x + self.y)


my_class = MyClass(5, 4)
my_class.add()
9

組み込み関数、モジュール、パッケージ

用語整理

260-python-basic-function_module.png
  • 組み込み関数
  • モジュール
    • 再利用可能な関数やクラスが定義されたPythonスクリプトファイルです。
    • モジュールには 自作モジュール 標準モジュール 外部モジュール が存在します。
    • ライブラリとも言います。
    • import することで利用できます。
  • 標準モジュール(標準ライブラリ)
  • 外部モジュール(外部ライブラリ)
    • サードパーティ製の外部ライブラリです。
    • https://pypi.org/ で公開されています。
    • pythonをインストールしただけでは存在しません。
    • パッケージマネージャでインストール後、import で取り込む必要があります。
  • パッケージ
    • 複数の同じような機能をもつモジュールを ディレクトリに集めたもの です。
    • __init__.py を作ることでパッケージになります。
      • __init__.py はパッケージを読み込む時に、最初に読み込まれます。

参考
https://docs.python.org/ja/3/tutorial/modules.html

e.g.) モジュールのimportと利用

下記、構成を例にモジュールを利用してみます。

├── xxx
│   ├── yyy
│   │   ├── __init__.py
│   │   └── ccc_module.py
│   ├── __init__.py
│   └── bbb_module.py
└── module_test.py
260-python-basic-function_thumbnail_module2.png

パッケージは「ディレクトリ」で、モジュールは「pythonスクリプトファイル」になります。

def add(x, y):
    print(f"__name__ = {__name__}")
    print(f"{x} + {y} = {x + y}")
def sub(x, y):
    print(f"__name__ = {__name__}")
    print(f"{x} - {y} = {x - y}")
import xxx.yyy.ccc_module
from xxx import bbb_module


def main():
    print(f"__name__ = {__name__}")

    # importのみの指定なので、フルパスで指定します。
    xxx.yyy.ccc_module.add(4, 2)

    # from指定なので、モジュール名のみの指定でアクセスできます。
    bbb_module.sub(4, 2)


if __name__ == "__main__":
    main()

実行結果は以下のようになります。

$ python module_test.py
__name__ = __main__
__name__ = xxx.yyy.ccc_module
4 + 2 = 6
__name__ = xxx.bbb_module
4 - 2 = 2

「__name__」について

__name__ には、Pythonファイルのモジュール名が文字列で格納されます。

python ファイル名.py で実行したとき、ファイル名.py 内の __name__"__main__" になります。

いろいろなインポート方法

import パッケージ名.モジュール名

import package_name.module_name

package_name.module_name.method_name()
package_name.module_name.class_name()

import パッケージ名1.パッケージ名2.モジュール名

import package_name1.package_name2.module_name

package_name2.module_name.method_name()
package_name2.module_name.class_name()

from パッケージ名 import モジュール名

from package_name import module_name

module_name.method_name()
module_name.class_name()

from パッケージ名 import モジュール名 as 別名

from package_name import module_name as name

name.method_name()
name.class_name()

from パッケージ名.モジュール名 import メソッド名

メソッドを直接利用できるようになりますが、どこのメソッドかわかりづらいの推奨されていません。

from package_name.module_name import method_name

method_name()

import パッケージ名.*

* を利用すると、__init__.py__all__ で指定されたモジュールを読み込みます。
どのパッケージのモジュールなのかわかりづらいので推奨されていません。

__all__ = ['ccc_module]
from xxx.yyy import *

ccc_module.add(4, 2)

主な標準モジュール

モジュール 概要
datetime 日付や時刻の操作
string 文字列操作
re 正規表現操作
math 数学関数
random 乱数生成
collections コンテナデータ型
enum 列挙型のサポート
os.path 共通のパス名操作
shutil ファイル操作(コピーなど)
fileinput 複数ファイルを1度にまとめて処理できる

そのほか、Pythonモジュール索引から調べることができます。

https://docs.python.org/ja/3/py-modindex.html

わくわくBank.
フリーランスのエンジニアとして活動してます。ここでは、ソフトウェア開発で必要とされる技術、用語、概念を整理しています。