2021-02-26

【問題】Python チュートリアル モジュール

python_code_img

Pythonチュートリアルの「モジュール」に関連した問題を掲載します。各問いにスクリプトの記述と実行で解答してください。

問題

Q1.モジュールの作成

任意のディレクトリ(以降、プロジェクトと呼びます)にprime_factorization.pyを作成してください。ファイル内には下記のコードを記入してください。

def pm(num: int):
    digit = len(str(num))
    div_num = 2
    while num > 1:
        if num % div_num == 0:
            print(f"{int(num)}".rjust(digit), div_num)
            num /= div_num
            continue
        div_num += 1
    print(f"{int(num)}".rjust(digit), None)


def pm2(num: int):
    res = []
    div_num = 2
    while num > 1:
        if num % div_num == 0:
            res.append((int(num), div_num))
            num /= div_num
            continue
        div_num += 1
    res.append((int(num), None))
    return res

Q2.モジュールの読み込み(1)

プロジェクト直下にq2.pyを作成して、q2.pyからprime_factorization.pyを読み込んでください。

Q3.関数を呼び出す(1)

q2.pyから関数pmを実行してください。引数には1000を設定します。

Q4.関数を呼び出す(2)

q2.pyから関数pm2を実行してください。引数には123456789を設定します。

Q5.モジュールの読み込み(2)

q5.pyを作成して、q5.pyprime_factorization.pyから関数pmpm2を読み込んでください。ただし、*で読み込みはしないでください。その後、Q3とQ4と出力を得られるように、各関数を実行してください。

Q6.モジュールの読み込み(3)

q6.pyを作成して、q6.pyprime_factorization.pyprime_factという名前で扱えるようにして、読み込んでください。その後、Q4と同じ出力方法でpm2を実行してください。

Q7.モジュールをスクリプトとして実行する

以下の2点を満たす状態で、prime_factorization.pypm2を実行できるように追記してください。その後、コマンドラインから123456789を送り、pm2の返り値を出力してください。

  • importされたときに追記したコードが実行されないようにすること
  • コマンドラインから引数を受け取り、pm2 を実行できるようにすること

Q8.モジュールの検索

以下の構成例を参考に、作成したプロジェクトの親Directoryにもう1つ任意のディレクトリをつくってください。

作ったディレクトリにprime_factorization.pyをコピーして、prime_fact.pyに名前を変更してください。その後、プロジェクトにq8.pyを作成して、prime_fact.pyを読み込んで、関数pm(1000)を実行できることを確認してください。

モジュールの読み込みについては、sys.path.appendで読み込み先を追加してください。

# 構成例
C:\
├─hoge
│  └─prime_fact.py
└─src
    ├─prime_factorization.py
    ├─q2.py
    ├─q5.py
    ├─q6.py
    └─q8.py

Q9.モジュールの構成

q9.pyを作成して、prime_factorization.pyで定義されている名前のリストを出力してください。

Q10.パッケージの作成

プロジェクトにmy_packageディレクトリを作成して、math.py__init__.pyを作成してください。math.pyに以下の関数を定義してください。

pi = 3.141592653589793

def add(a, b):
    return a + b

その後、プロジェクト直下にq10.pyを作成して、q10.pypiaddを読み込んでください。その後、関数add(pi, 3)を実行して、結果を出力してください。

解答

A1.モジュールの作成

C:\src
└─prime_factorization.py

prime_factorization.pyを任意の場所に作成して、prime_factorization.pyに指定のコードを記述してください。

A2.モジュールの読み込み(1)

C:\src
├─prime_factorization.py
└─q2.py

プロジェクト内にq2.pyを作成して、同じ場所にあるprime_factorization.pyを読み込みます。

import prime_factorization

コマンドでの実行例は以下の通りです。

PS C:\src> python q2.py

PycharmやVSCodeなどのIDEを使っている場合には、をクリックして実行できます。以降も、実行環境にあわせて都合の良い方法でスクリプトを実行してください。

この問題では、モジュールを読み込むだけのため、prime_factorization.pyを読み込むimport文を記述した状態で何も起こらない場合には、prime_factorizationの読み込みに成功していると判断できます。

A3.関数を呼び出す(1)

q2.py

import prime_factorization

prime_factorization.pm(1000)

出力

1000 2
 500 2
 250 2
 125 5
  25 5
   5 5
   1 None

A4.関数を呼び出す(2)

q2.py

import prime_factorization

# prime_factorization.pm(1000)
ret = prime_factorization.pm2(123456789)
print(ret)

出力

[(123456789, 3), (41152263, 3), (13717421, 3607), (3803, 3803), (1, None)]

A5.モジュールの読み込み(2)

q5.py

from prime_factorization import pm, pm2

pm(1000)
ret = pm2(123456789)
print(ret)

A6.モジュールの読み込み(3)

q6.py

import prime_factorization as prime_fact

ret = prime_fact.pm2(123456789)
print(ret)

A7.モジュールをスクリプトとして実行する

prime_factorization.py

# pmとpm2関数は省略します
# pmとpm2関数は残して以下を追記してください

if __name__ == "__main__":
    import sys
    arg = sys.argv[1]
    ret = pm2(arg)
    print(ret) 

Command

PS C:\src> python prime_factorization.py 123456789
[(123456789, 3), (41152263, 3), (13717421, 3607), (3803, 3803), (1, None)]

A8.モジュールの検索

importの自動整形がかからない場合

import sys
# q8.pyがある場所から親Directoryを参照
sys.path.append("./../")

from hoge import prime_fact
prime_fact.pm(1000)

スタイルガイドに従い自動整形される場合

import sys
sys.path.append("./../")


def main():
    from hoge import prime_fact
    prime_fact.pm(1000)


if __name__ == "__main__":
	main()

A9.モジュールの構成

q9.py

import prime_factorization

ans = dir(prime_factorization)
print(ans)

出力

['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'pm', 'pm2']

A10.パッケージの作成

構造

C:\src
├─my_package
│  ├─__init__.py
│  └─math.py
├─prime_factorization.py
├─q10.py
├─q2.py
├─q5.py
├─q6.py
├─q8.py
└─q9.py

q10.py

from my_package.math import add, pi

ret = add(pi, 8)
print(ret) # 6.141592653589793