モジュール化(''modularization / modularize'')は、全体をいくつかの構成単位に分割し、問題の規模と質を低減する分割統治法(''divide-and-conquer method'')の一つです。
Pythonでは、パッケージ(''package'')とモジュール(''module'')がモジュール化の実現に用いられます。
このうち、パッケージはモジュールの構造的な整理手段と考えられ、まずモジュールの用途・用法について解説し、モジュールをユーザーが定義する具体的な例も示します。
平方根などの数学に関する関数を使用したい場合は、モジュールmathをインポートします。
[https://paiza.io/projects/eMPxW9RNpDDcWAdUa41SqQ?language=python3 モジュールmathの関数「sqrt()」を使い平方根を求める]:
import math
print(math.sqrt(2))
help(math.sqrt)
実行結果:
1.4142135623730951
Help on built-in function sqrt in module math:
sqrt(x, /)
    Return the square root of x.
構文:
import モジュール名
また、インポートされた関数をつかうときは、どのモジュールに由来する関数かを、pythonが判断できるようにするために、「math.sqrt()」のように、関数の前にモジュール名を書きます。
「.」はドット記号です。つまり、「モジュール名.関数名」のような書式になります。
モジュールmathでは、三角関数や指数関数なども、使えます。三角関数の単位は、ラジアンです。
※ ラジアンは弧度法の角度の単位で記号は rad です。とはなにか、高校で習います。度数法で円周は360°ですが、弧度法では2π rad です。
[https://paiza.io/projects/gVwzh8Xpwa5h8AOBD85fRQ?language=python3 モジュールmathの関数「sin()」を使い正弦を求める]:
import math
print(math.sin(math.pi/4))
実行結果:
0.7071067811865475
[https://paiza.io/projects/RBllWFihUJzw0KWLEZOJ4w?language=python3 モジュールmathの属性一覧]:
import math
mod = math
print(f"""\
{}")
サイコロの目のような、乱数をつかうには、モジュールrandomをインポートします。
モジュールmathの関数「sqrt()」を使い乱数を得る:
import random
for _ in range(32):
    print(random.randint(1, 6), end=" ")
実行結果:
1 2 3 1 3 6 3 3 5 6 4 5 2 1 5 2 2 2 4 4 5 1 2 6 5 5 1 2 1 5 3 5 
により、a以上でb以下の整数を、不規則に表示することができます。
たとえばモジュールmathから、sqrtだけをローカル名前空間へインポートしたい場合、コードが次のようになります。
[https://paiza.io/projects/EsGtaRtUcJMoeot8wrjdIw?language=python3 mathで定義されているsqrtを全てローカル名前空間にインポート]:
from math import sqrt
a = sqrt(2)
print(a)
実行結果:
1.4142135623730951
構文:
from モジュール名 import インポートする識別子
の書式により、特定の関数だけを選んでインポートできます。
ローカル名前空間にインポートした識別子は、「math.」をつけず、そのまま「sqrt(2)」のように呼び出せます。
[https://paiza.io/projects/HlkO-5n76qXr05U0viqAJw?language=python3 mathで定義されている識別子を全てローカル名前空間にインポート]:
from math import *
print(f"{sqrt(2)=}")
print(f"{pi =}")
実行結果:
sqrt(2)=1.4142135623730951
pi =3.141592653589793
 を指定しても、アンダースコア _ で始まる識別子はインポートされません。
ここまでは、標準ライブラリーのモジュールを紹介してきましたが、モジュールはユーザー自身で定義することもできます。
ここでは、与えられた数が素数か否かを判定するモジュール isprime を作ってみましょう。
isprime.py
"""
isprime:
  Determine if a given number is prime
Usage:
  import isprime
  
  isprime.isprime(42)
  
  OR
  from isprime import isprime
  
  isprime(4423)
"""
_primes = set()
_noprimes = set()
def isprime(x :int) -> bool :
    '''
    >>> isprime(2)
    True
    >>> isprime(10)
    False
    '''
    if x in _primes:
        return True
    if x in _noprimes:
        return False
    if x <= 1:
        return False
    i = 2
    while i*i <= x:
        if x%i == 0:
            _noprimes.add(x)
            return False
        i += 1
    _primes.add(x)
    return True
if __name__ == '__main__':
    assert not isprime(-1)
    assert not isprime(0)
    assert not isprime(1)
    assert isprime(2)
    assert isprime(3)
    assert not isprime(4)
    help(isprime)
アンダースコア _ で始まる識別子は、from MODULE import * でローカル名前空間に読み込まれません。
過去に素数判定を行った履歴を残し、履歴に残った判定結果を再利用するためにだけ使うので、アンダースコア _ を前置してモジュール内だけで使うことを表しましたfrom isprime import _primes とすれば _primes としてローカル空間に現れるので、隠蔽という意味では完全ではなく、「将来の実装では参照できることを保証しません」程度の意味です（意訳：使うな！）。。
isprimeだけがモジュール外から可視化された識別子となります。
if __name__ == '__main__':以下は、このファイルがモジュールではなく、メインスクリプトとして実行されたときに評価され、回帰テストなどを書くことが一般的です。
[https://paiza.io/projects/FQ8GE_F8FiPlFaAOVHWdTw?language=python3 Main.py]:
import isprime
hash = {}
for x in range(100):
    hash[x] = isprime.isprime(x)
print(hash)
help(isprime)
実行結果:
{0: False, 1: False, 2: True, 3: True, 4: False, 5: True, 6: False, 7: True, 8: False, 9: False, 10: False, 11: True, 12: False, 13: True, 14: False, 15: False, 16: False, 17: True, 18: False, 19: True, 20: False, 21: False, 22: False, 23: True, 24: False, 25: False, 26: False, 27: False, 28: False, 29: True, 30: False, 31: True, 32: False, 33: False, 34: False, 35: False, 36: False, 37: True, 38: False, 39: False, 40: False, 41: True, 42: False, 43: True, 44: False, 45: False, 46: False, 47: True, 48: False, 49: False, 50: False, 51: False, 52: False, 53: True, 54: False, 55: False, 56: False, 57: False, 58: False, 59: True, 60: False, 61: True, 62: False, 63: False, 64: False, 65: False, 66: False, 67: True, 68: False, 69: False, 70: False, 71: True, 72: False, 73: True, 74: False, 75: False, 76: False, 77: False, 78: False, 79: True, 80: False, 81: False, 82: False, 83: True, 84: False, 85: False, 86: False, 87: False, 88: False, 89: True, 90: False, 91: False, 92: False, 93: False, 94: False, 95: False, 96: False, 97: True, 98: False, 99: False}
Help on module isprime:
NAME
    isprime
DESCRIPTION
    isprime:
      Determine if a given number is prime
    Usage:
      import isprime
      
      isprime.isprime(42)
      
      OR
    
      from isprime import isprime
      
      isprime(4423)
FUNCTIONS
    isprime(x: int) -> bool
        >>> isprime(2)
        True
        >>> isprime(10)
        False
FILE
    /workspace/isprime.py
help()関数にモジュールを渡すと __docstring__ がレンダリングされます。