eljefeblog 

Any sufficiently advanced technology is indistinguishable from magic

programming python-basic-lectures

【基本を学ぶ8:超初学者向け】Pythonプログラミング入門【モジュール編】

Pythonプログラミング入門【モジュール編】




(初めからしっかり学びたい方はこちら↓↓)



このシリーズを最後まで学習することで
Pythonプログラマとして太い知識の主軸を積み上げる事ができます。
本シリーズでは全てを物事の網羅しているのではなく、最低限必要な情報のみ提供している為、
処所超初心者の方には理解が難しい箇所があると思われます。



分からない箇所はその用語なり、エラーをググる力をつけましょう。
執念深く自分の理解していないポイントを追求する事で
今のあなたに必要な書籍、それに関連する様々な付加情報を手に入れる事ができるはずです。



本記事はモジューについて詳しく理解し実際に自作する内容となります。



悩むペン銀

これまで基本的な構文を勉強してきたけど、もっと効率的なプログラムの書き方を勉強してよりPythonをモノにしたい。

Pythonではコードを再利用する為にどの様な方法があるかより深く知りたい。


本記事ではこのような疑問に答えていきます。


本記事の内容

  • モジュールに関する基礎知識
  • 実際にモジュールを自作し、利用する方法について



  • これまで関数やクラスなど、
    1度書いたコードを再利用する仕組みを少しずつ学んできました。



    モジュールは関数やクラスより大きな概念として
    コードの再利用を目的とした仕組みの1つです。
    すでに第6回目ではpythonに標準装備されたモジュール(e.g. math, random…etc)を試してみましたね。



    しかしながらモジュールは自作することも可能です。



    そして自作したモジュール内で定義された関数やクラスは
    Pythonの標準モジュール同様、importする事で他のモジュール内で利用でき、作業効率を大幅に向上させることが出来ます。



    多くの場面で役に立ち、かなり学ぶ価値があります。












    モジュールの概要



    モジュールって何?




    シリーズの第6回目で少し触れましたが、Pythonでのモジュールとは
    プログラムのコードやデータを再利用するためのものであり、
    さらに具体的に説明するとPythonで記述された各ファイルのことを指します。
    (作成されるPythonのファイルには拡張子『.py』を付けます)


    作成された各モジュールではimportすることにより、
    別のモジュールに記述されたクラスや関数を再利用することが可能になります。



    Pythonにおけるコードの再利用を促進する仕組みは複数ありますが
    大まかに以下のような枠組みがあります。






    関数やクラスなど、Pythonで記述されたファイルがモジュールであり
    そのモジュールを集め1つにまとめたものがパッケージと呼ばれます。


    そしてその複数のパッケージを纏めたものがライブラリと一般的に定義されています。




    モジュールを使う理由



    モジュールを利用する理由は大きく以下3つ挙げられます。

  • 同じコードを書く手間を省き楽ができる
  • プログラムを細分化する事でコードを理解し易くなる
  • 細分化によりメンテナンスし易くなることからバグが減る


  • 1つのプロジェクトに携わると、
    『ちょっと異なるけど、同じ様な機能を持ったオブジェクトを用意したいな』
    と言った場面に頻繁に直面します。
    そして、その場面毎にちょっとした機能を追加する為
    何度も似た様なコードを書くことは生産的ではありません。



    モジュールは1度書いてしまえば中に記述した関数やクラスを何度でも再利用できますし、
    追加の機能が必要となった場合でも、少しのコードを追加することで対応できる場面がほとんどです (本記事では触れませんがPythonにはデコレータという概念が用意されており、すでに定義された関数に追加機能を付加する事が可能です。後々の記事での紹介を予定しています)



    またコードをモジュール化していく事でプログラムの処理内容を細分化でき、1000行や2000行も書かれた分かりにくいコードの生産を避け自他共に理解のしやすいコードを書ける様になります。



    細分化されたコードはメンテナンスし易く、様々なバグを未然に防ぐ事ができるでしょう。
    モジュールを使いこなす事で、様々な観点より多くの恩恵を受けれるのでぜひ積極的に学んでいきましょう。




    具体的にモジュールには以下3つ基本的な特徴・ルールがあります。



  • コードの再利用
    モジュールを作成することで、Pythonの対話環境でexitした際には保存されなかったコードを永久に保存する事ができます。保存されたモジュールは新しいプロジェクトでも再利用できる為同じコードを書く手間が省け、プロジェクトの作業時間の短縮が可能です。

  • 名前空間(Namespace)の分割
    Pythonのみならず、多くのプログラミング言語において変数はユニークである必要があります。モジュール(ファイル)内に定義された変数はそのモジュール内でのみ使用されます。他のモジュールに同様の変数があったとしても、値が共有されることはありません。

  • 共通のデータ実行
    運用上の観点からプロジェクトにおける複数のコードにおいて、同じ動作が必要とされる場面が多々あります。この様な時モジュールを作成しておく事でグローバルオブジェクトをimportするだけで良いためとても便利です。



  • コードは再利用可能である事が重要となってきます。
    書いたコードを使い捨てせず、なんども再利用する事ができるというのは
    プロジェクトの開発速度を加速させる為です。





    モジュールを自作してみる



    さて、これまで記事を読み進めてきて
    モジュールについて大まかな概要をつかむことが出来たと思います。
    それではさっそく自作してみましょう。



    Pythonにおいてモジュールは非常に作りやすく、
    テキストエディタで簡単に作成することが出来ます。



    モジュールの作成



    モジュールを定義するには、テキストファイル(拡張子は.py)にテキストエディタを使いPythonのコードを記述するだけです。
    Pythonではこの形式で記述された如何なるファイルもモジュールとして扱われます。



    例えば以下の様なモジュール(ファイル)を作ってみましょう。
    ファイル名は自由ですが拡張子を忘れるとモジュールとして機能しないので気を付けましょう。
    また予約語(e.g. if, for, while..etc)も同様にファイル名としてはいけません。

    ここでは『printer.py』で作成してください。



    ファイルには以下の様なコードを書き保存しておきましょう。

    def name_printer(name):
        print(name)
    
    def calculate_square(number):
        return number**number
    
    def greeting();
        print("hello world!")


    これでname_printer, calculate_square, greetingという3つの関数を持ったprinterというモジュールを作成することが出来ました。



    モジュールの利用



    それでは実際にPythonの対話環境を立ち上げて
    printerモジュールをimportしてみましょう。


    インポート方法は以下です。

  • モジュールはそのファイル名を指定してimportする
  • モジュール内に定義された関数は『モジュール名.関数』の形式で呼び出す
  • >>>
    >>> import printer
    >>> my_name = "Seimei"
    >>> 
    >>> printer.name_printer(my_name)
    Seimei
    



    2行目でprinterモジュールをimportし、3行目で変数を定義
    5行目でモジュールから関数my_printerを呼び出してきて定義した変数my_nameを引数として渡しています。



    関数は受け取った引数を組み込み関数print()により出力している。
    というのが一連の動作です。



    別名でimportする



    先程はモジュールprinterとしてインポートしました。
    しかしもっと覚えやすい名称や手短にかける名称に変えたい場合も出てくるでしょう。
    そんな時は以下のように書くこともできます。

    >>> import printer as pt
    >>> my_name = "Seimei"
    >>> pt.name_printer(my_name)
    Seimei
    >>> pt.greeting()
    hello world!

    これによりモジュールprinterをptとしてインポートできます。


    特定の関数をimportする



    またモジュール自体を呼び出すのではなく
    モジュール内の特定の関数やクラスだけ呼び出したい場合もあるでしょう。
    そんな時はモジュールのimportについてはfromを使い以下の書き方もできます。



    このモジュールの呼び出しではモジュール内の特定の関数のみ(この場合name_printer)を呼び出しており、モジュールを丸ごとimportしない事が特徴です。


    >>>
    >>> from printer import name_printer
    >>> from printer import calculate_square
    >>> name = "Seimei"
    >>> name_printer(name)
    Seimei
    >>>
    >>> number=12
    >>> calculate_square(number)
    8916100448256
    



    ここでimportとfrom、結局どっちを使えばいいの?
    という疑問が湧いたかもしれません。



    結論から述べると

  • 自分しか見ないプログラムを書く場合はfrom
  • 他者と開発を行う場合にはimport
  • を使う方が良いでしょう。


    mathモジュール内のfabs関数を利用する場合を想定し理由を説明します。
    それぞれ以下のようにインポートする事ができます。



    >>> import math
    >>> from math import fabs
    >>> 
    >>> a = fabs(-5) # fromの場合
    >>> a 
    5
    >>>
    >>> b = math.fabs(-5) # importの場合
    >>> b
    5



    fabs関数は引数の絶対値を返す関数です。
    どちらの方法でも同じ関数をインポートできています。



    fromを使う場合、確かに特定のモジュールから関数を指定しインポートする為
    短いコードで関数を呼び出す事ができます。
    自分しか見ないプログラムを書く場合やなど、比較的早く機能を実装する事ができるでしょう。



    一方で仕事など、他者のためにプログラムを書く場合、
    プログラムが長くなればなるほど、どのモジュールからfabs関数をインポートしてきているのか、分かりづらくなる問題があります。



    さらに悪い事にはfabs関数が自作の関数なのか、はたまたインポートしてきた関数なのか困惑してしまうこともあるのです。
    誤解を招く要因となる可能性があるので気を付ける必要があるでしょう。
    基本的にimportでの呼び出しを理解し習得しておけば、何の問題もありません。



    復習問題


    それでは以下の処理を実現するコードを書いてみましょう。

    
  • 問題1:tmp.pyというファイルを作成し、中に文字列’hello world’を出力するpriter()という関数を定義してください。さらにPythonの対話環境においてtmpモジュールをインポートし、作成したprinter関数を呼び出してみましょう。
  • 問題2:tmpモジュールをprinterという名前でインポートし、さらにprinter関数を呼び出してみましょう。




  • Package(パッケージ)



    前述した通り、モジュールとはPythonで記述されたコードを1つのファイルにまとめたものでした。
    Pythonでのアプリケーションを大規模にするにはこのモジュールを複数かき集め1つのディレクトリに収納し、パッケージとして組織する事がオプションとしてあります。



    ここでのポイントはこのディレクトリには__init__.pyという名前の初期化ファイルを作成する必要があり、モジュールをインポートした際、真っ先に実行されるという事です。(中身は空でも構いません)
    Pythonはこのファイルがある事でそのディレクトリをパッケージとして認識します。






    まとめ




    いかがだったでしょうか?

    今回はPythonにおけるコードを再利用する方法について
    モジュール利用に関する知識を深めていきました。

    本シリーズでは基本的な内容を重点的に紹介している為
    発展的な内容については不十分な側面があります。


    今後、Python中級編のシリーズにて紹介予定ですが
    ぜひ興味を持って自ら積極的に調べてみましょう。
    さらに面白い使い方を学ぶ事ができるはずです。



    今回は以上です。
    ではでは





    人気記事【初学者必見】効率的なプログラミング勉強方法を紹介します

    人気記事 CS学位取得者がガチでプログラミングスクールを調査してみた件【おすすめのスクール】





    続編はこちら↓↓






    このエントリーをはてなブックマークに追加
    data-ad-format="rectangle" data-ad-format="rectangle"

    返信する

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

    某国立大学大学院(理系)に所属しています。 最近の趣味は人工知能関連の論文を読む事で 研究ではComputer Vision周りを中心に活動しており、 サイドワークとしてデータ分析の業務に関わっています。 本ブログはこれまで筆者が学んできた様々な知識の中から 有益だと思えた情報のみをまとめたものです。 内容は個人の見解であり、所属する機関と関係するものではありません。 Research: is related to Computer Vision Hobby: is to study Artificial Intelligence / Machine Learning.