チュートリアルその2モジュール・パッケージ ぱらぱらめくるPython3.4.3

  • モジュールやらパッケージやらをやってみる
  • モジュールって言うのは、関数をテキストファイルに書いたもの
  • 使い方は2つあって
  • スクリプトとして実行するときには、そうでないときのモジュールファイルの末尾に以下を付け加える
    • その心は
      • スクリプト実行のときには、読み込まれたモジュールファイルは、"main"という名前を持つものとして扱われるので、第1行にて、条件合致して、それ以下が実行されるという仕組み
if __name__ == "__main__":
    import sys
    fib(int(sys.argv[1]))
  • モジュール全体は以下のようになる
# Fibonacci numbers module

def fib(n):    # write Fibonacci series up to n
    a, b = 0, 1
    while b < n:
        #print(b, end=' ')
        print(b)
        a, b = b, a+b
    print(__name__)


def fib2(n): # return Fibonacci series up to n
    result = []
    a, b = 0, 1
    while b < n:
        result.append(b)
        a, b = b, a+b
    return result

if __name__ == "__main__":
    import sys
    fib(int(sys.argv[1]))
>>> import fibo
>>> fibo.fib(10)
1
1
2
3
5
8
fibo
    • 最後に”fibo.py"の"fibo"が出力されているのは、”__name__"として取り出したそれが出ているから
  • これをスクリプト実行すると、以下のように"main"と出力されている
$ python3.4 fibo.py 10
1
1
2
3
5
8
__main__
  • ちなみに、モジュールファイルの再読み込みには以下のようにする必要がある
import imp
imp.reload(fibo)
  • パッケージとは
    • 複数のモジュールファイルを集めたもの(らしい)
    • で、複数のモジュールファイルが相互に関連することを保証するべく、ディレクトリ構成におさめるルールになっており、ディレクトリ構成におくべき基準ファイルも決まっている。それをルートに相当するディレクトリごと「パッケージ」として扱い、名前空間的にほかのパッケージ・モジュールとの衝突を回避してくれる(らしい)
    • その「基準ファイル」とは"__init__.py"という名前のファイルで、空でもよいらしいが、以下のキャプチャ画像にもあるように、ディレクトリの下に置いてある。下階層にあたる"test"ディレクトリの中にもやはり"__itni__.py"という名前のファイルを置き、そうすることで、その中身もパッケージの中だ、ということにしてある

    • さて作る
    • デスクトップに以下のように、hogeというディレクトリを作り、その下にfiboというディレクトリを作り、その下に、fibo.pyというモジュールファイルを置いた、たった一つのモジュールファイルのために2階層にしたパッケージディレクトリ構成を作った
    • __init__.pyをそれぞれのディレクトリにおいた
>>> import hoge.fibo.fibo # インポートする
>>> help(hoge.fibo.fibo.fib) # ヘルプも出る

>>> hoge.fibo.fibo.fib(10) # 中の関数も動く
1
1
2
3
5
8
hoge.fibo.fibo
  • 7 ファイルの読み書き
    • 行列型のタブ区切りデータが読み出せればひとまず用は足りる
    • python3.4には未対応のようだが、python2.7なら動く、numpyを使えば以下のようにできる
import numpy as np
f = open("test.txt","rU")
dd = np.loadtxt(f)
In [26]: dd
Out[26]: 
array([[ 0.01414055,  0.66767908,  0.97793192],
       [ 0.41075304,  0.97927349,  0.43193997],
       [ 0.81127585,  0.6111602 ,  0.46872857],
       [ 0.09773468,  0.18508936,  0.92162989],
       [ 0.35866227,  0.69953142,  0.00321682],
       [ 0.24877563,  0.0652488 ,  0.27972918],
       [ 0.08696907,  0.87939775,  0.41152712],
       [ 0.16413958,  0.09554244,  0.37627093]])
    • ちなみにpython2.7とpython3.4が共存しているときに、
sudo easy_install numpy
    • とかとやると2.7の方に入るようで
pip3 install numpy python3.4
    • のようにpipにもバージョン指定したりする必要があるらしい
  • 8 エラー:は飛ばして
  • 9 クラス
    • pythonのクラスは『メソッドの第一引数がそのクラスのインスタンスそれ自身 (一般に self と書かれる)』という話と関係することなのですが、pythonの内側から定義の説明を受けてもよくわかりません
    • というわけで、この節は、こちらの記事を読むことにします
    • こちらこちらはクラス定義ファイルの読み方・書き方がわかりやすい
    • 属性を持たせるのに、クラスの段階でその属性を持つのか、サブクラスの段階なのか、さらにその下の…と、どこで持たせてもよいし、場合によっては、同じ属性がインスタンスによって異なるクラスレベルにあるかもしれない。それを階層から再帰的探索で引っ張りだす仕組み担っている。そのときにselfを使うことで再帰のやり方の取り決めを入れている、そんなクラス・継承の作りです、と、そういうこと??
    • 『Pyhton は基本的には(広い意味での)関数型言語で、オブジェクト指向はハッシュ表を使って後付したものです。』このハッシュ表の完成のためにselfが必要ということ??
    • クラスを作り、継承し、しかも多重継承し、クラスを使って構造体のようなものも作り、イテレータやそれを作る元となるジェネレータもクラスの構成法の賜物、と書いてある。この点は、クラスを作りながらでないと、ちょっと本当のところはわかった気がしない
  • 10 標準ライブラリツアー
    • 使うのは:
      • math
      • random
      • timeit