Software_Python3

☆Python


◎モジュール


◆標準モジュール

_◇標準モジュールとビルトインモジュール

※標準モジュール
│ ライブラリとして組み込み

※ビルトインモジュール
│ インタープリタに組み込みになっているモジュール
│ ⇒OSのプリミティブにアクセスするためのものなど

※ビルトイン関数 dir() と help()によるモジュールの調査
import モジュール名
dir(モジュール名)
│ モジュールの全関数のリスト
help(モジュール名)
│ モジュールのdocstringから生成されたマニュアル

_◇sys ビルトインモジュール
すべてのPythonインタプリタにビルトインされている。

システムパラメータと関数を含む

sys.ps1
│ プライマリプロンプト文字列、対話モードのみ
sys.ps2
│ セカンダリプロンプト文字列、対話モードのみ
sys.path
│ モジュール検索パス

sys.argv
│ コマンドライン引数を保持する。リストの最初の要素はスクリプト名

sys.stdin

sys.stdout

sys.stderr
例)
│ sys.stderr.write(‘xxx\n’)

_◇osモジュール

オペレーティングシステムとやりとりする
⇒低水準の関数
⇒通常のファイル操作などは高水準インタフェース shutil モジュールがよい

※ os.listdir(“パス”)
フォルダ内容をリストとして列挙

※ os.chdir(“パス”)
パスにカレントディレクトリを移動

※ os.getcwd()
カレントディレクトリのパスを得る

※osモジュール内にもopenが定義されているので、名前空間を汚染しないように
import os
した後は、osモジュールを明示的に呼ぶのが良い

_◇shutilモジュール

高水準のファイル操作

例)

import shutil
shutil.copyfile('dat.db', 'bak.db')
shutil.move('/adir/bfile', 'cdir')

_◇globモジュール

ディレクトリのワイルドカード検索

例)

import glob
glob.glob('*.py')

_◇コマンドラインオプションのパーサ

※getoptモジュール

※optparseモジュール

_◇stringモジュール

※Templateクラス

_◇文字列パターンマッチング

reモジュール

①検索
re.search(‘パターン’, 対象文字列 [,フラグ])
⇒マッチすればマッチオブジェクトが返る、そうでなければNone

例)grep的処理
for line in file(filename):
if re.search(pattern, line): print(line)

※特定のパターンを抜き出すときは ( ) でグループ化することで、特定部分のみを抜き出すことができる
⇒グループの取り出し方法
matched = re.search(…
matched.groups() <=全てのグループを含むタプル
matched.groups(0) <=正規表現相当の文字列全体
matched.groups(1) <=グループ1(最初のグループ)

②マッチしたパターンを返す
re.findall(‘パターン’, 対象文字列)
⇒マッチした文字列のリストが返る
⇒()によるグループ化も可能

③置換
re.sub(‘パターン’, ‘置換文字列’, 対象文字列 [,最大置換回数])
⇒置換をおこなう。最大置換回数を省略すると全てとなる
⇒置換文字列には関数を含めることができる

※re.subn()
⇒置換し、置換後の文字列と回数をタプルに組んで返す

④スプリット
re.split(‘パターン’, 対象文字列 ,最大断点数)
⇒スプリットしてリストを返す(文字列のsplitメソッドと同様)

_◇出力整形

※reprlib

※pprint

※textwrap

_◇バイナリデータレコード処理

※struct
pack/unpack

_◇マルチスレッド

※threading

※queueモジュール

_◇ロギング

※logging

_◇弱参照

※weakref

_◇ガベージコレクタ制御

※gc
gc.collect()
│ ガベージコレクション実行

_◇リスト操作など

※array

※collections

deque()オブジェクト

※bisect
ソート済リストを操作する

※heapq
リストをベースにヒープを実装する

_◇mathモジュール
数学関数、定数など

※math.fsum()
│ 加算時の精度低下を和らげる加算関数

_◇cmath
複素数用のmathモジュール

_◇浮動小数点10進数

※decimal

Decimalクラス

_◇fractions
有理数を表現

_◇randomモジュール

random.choice(リスト)
リストのなかからランダムに選択

random.sample(range(レンジ), 個数)
重複なしてランダム抽出

random.random()
ランダムな浮動小数点数

random.randrange(レンジ)
ランダムな整数

_◇http通信: urllib

例)

import urllib
site = urllib.urlopen("http://google.co.jp")
site.readline()

例)

for line in urllib.urlopen('http://www.au.kddi.com/'):
    if '2013' in line:
        print line

_◇メール送受信

※smtplib

※poplib

_◇メールメッセージの処理
MIMEなどの処理(RFC2822)

_◇datetimeモジュール

例)
>>> import datetime
>>> now = datetime.date.today()
>>> now
datetime.date(2013, 10, 26)
>>> now.strftime(“%y/%m/%d”)
’13/10/26′
>>> birthday = datetime.date(1959, 5 , 11)
>>> age = now – birthday
>>> age.days
19892
>>> age.days / 365
54

_◇timeit

コード断片の実行時間計測

※メソッドとして
import timeit
timeit.timeit(‘実行コード’, setup=”import …; …”, number=xxxxx)

※コマンド
python -m timeit ‘実行コード’

_◇zlib
データ圧縮

例)
>>> import zlib
>>> s = ‘aho bakamanuke witch which has which witches wrist watch’
>>> len (s)
56
>>> t = zlib.compress(s)
>>> len(t)
51
>>> t
‘x\x9cK\xcc\xc8WHJ\xccN\xccM\xcc+\xcdNU(\xcf,I\xceP(\xcf\xc8\x04\x92\x19\x89\xc5P\x16X4\x15\xc8+\xca,.Q(O\x04\xf2\x00S\xd8\x15\x11’
>>> zlib.decompress(t)
‘aho bakamanuke witch which has which witches wrist watch’
>>> zlib.crc32(s)
-1247493505

_◇パフォーマンス計測

※timeit
│ 微細な粒度レベル
※profile

※pstats

_◇品質管理

※doctest
docstringにテスト内容と期待値を書いておくだけで埋め込まれたテストの検証を行う

例)

>>> def average(values):
    """リストから算術平均
    >>> print(average([20, 30, 70]))
    40.0
    """
    return sum(values) / len(values)

>>> import doctest
>>> doctest.testmod()
**********************************************************************
File "__main__", line 3, in __main__.average
Failed example:
    print(average([20, 30, 70]))
Expected:
    40.0
Got:
    40
**********************************************************************
1 items had failures:
   1 of   1 in __main__.average
***Test Failed*** 1 failures.
TestResults(failed=1, attempted=1)
>>> 

※unittest
ユニットテスト(アサーション)を別ファイルにもって実行する

_◇リオートプロシージャコール

※xmlrpc.client, xmlrpc.server

_◇xmlパース

※xml.dom

※xml.sax

_◇csv読み書き

例)

import csv

    def saveLog(self):
        """
        save Log.
        
        ログファイルへ書き出す
        """
        with open(self.logName, 'wb') as f:
            csvWriter = csv.writer(f, dialect='excel')
            for row in self.log:
                csvWriter.writerow(row)
        f.closed

    def loadLog(self):
        """
        load Log.
        
        ログファイルを読み出す
        """
        with open(self.logName, 'rb') as f:
            csvReader = csv.reader(f, dialect='excel')
            for row in csvReader:
                self.log.append(row)
        f.closed

_◇国際化とエンコーディング

※デフォルトエンコーディングを確認
>>> import sys
>>> sys.getdefaultencoding()
‘utf-8’
>>> sys.getfilesystemencoding()
‘mbcs’
>>> import locale
>>> locale.getpreferredencoding()
‘cp932′

※stdoutに指定エンコーディングのラッパをかける
例)Python3.x
import sys, io
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding=’utf-8’)

例)Python2.x
import codecs, sys
sys.stdout = codecs.getwriter(‘utf-8’)(sys.stdout)

※gettext

※locale

_◇winreg ビルトインモジュール
Windowsシステムのみ

_◇Tkinter
GUI

※GUI構築の手順
① ウィジェットの生成
② プロパティを設定
⇒必要に応じてアクションを設定
③ 配置
④ アクションのハンドラを記述

例)

#!
# coding: utf-8
import sys
import Tkinter

class mainWindow(Tkinter.Frame):
    def __init__(self, master=None):
        Tkinter.Frame.__init__(self, master)
        self.master.title('GUI')
        self.buildGUI()

    def buildGUI(self):
        self.topFrame = Tkinter.Frame(self.master)
        self.topFrame.pack()
        self.middleFrame = Tkinter.Frame(self.master)
        self.middleFrame.pack()
        self.bottomFrame = Tkinter.Frame(self.master)
        self.bottomFrame.pack()
        self.displayPic = Tkinter.Label(self.middleFrame, width=20,text="xxx")
        self.displayPic.pack(side = Tkinter.LEFT)
        self.displayText = Tkinter.Label(self.middleFrame, width=40,text="777")
        self.displayText.pack(side = Tkinter.LEFT)
        self.fileButton = Tkinter.Button(
            self.topFrame, text="File", command=self.fileMethods)
        self.fileButton.pack(side = Tkinter.LEFT)
        self.exitButton = Tkinter.Button(
            self.topFrame, text="Exit", command=self.exitMethod)
        self.exitButton.pack(side = Tkinter.LEFT)
        self.statLine = Tkinter.Label(self.bottomFrame, width=60,text="yyy")
        self.statLine.pack(side = Tkinter.LEFT)
        
    def fileMethods(self):
        pass

    def exitMethod(self):
        sys.exit()

if __name__ == '__main__':
    m = mainWindow()
    m.pack()
    m.mainloop()


◆非標準モジュール

_◇lxml
XML processing library

_◇matplotlib
2D plotting library

※mpl_toolkits
Matplotlib Basemap Toolkit

※matplotlib.pyplot

http://turbare.net/transl/scipy-lecture-notes/intro/matplotlib/matplotlib.html
http://matplotlib.org/gallery.html

_◇numpy
array processing
数値計算用配列
データタイプは一種類に限られる
⇒異なるデータタイプを代入すると、共通のデータタイプに変形される

import numpy

※バージョンの表示
numpy.version.full_version
⇒バージョン文字列が返る

※注意:名前空間を汚染するとnumpy.array配列がPython標準の配列と競合する
⇒ from numpy import * は禁止
⇒ import numpy as np などとすること

※arrayのコンストラクト
例)
a = np.array([0, 1, 2, 3, 4, 5])

※arrayのインスタンスメンバ
a.ndim
│ 次元
a.shape
│ アレイの外形(各次元の要素数)
a.dtype
│ データタイプ
│ ⇒dtype(‘int32’)のような値を返す

※arrayの変形
例)
b = a.reshape((3,2))

※arrayのアクセス
a[0]
b[1][0]
⇒インデックス用の配列を用いて一部を取り出すこともできる
a[np.array([1,2,3])]

※arrayは変形しても新たにコピーされるわけではなく元のデータ構造を別な方法で指しているだけ
⇒必要ならば copy()メソッドでコピーする
例)

※numpyでは配列の要素に対して演算が行われる
例)
a*2
⇒pythonの通常listでは、*2するとリストの内容をコピーして倍の長さのリストを作る

※条件を満たす要素の取り出し
例)
a>4
⇒arrayの各要素が>4か否かを真偽値のarrayとして返す
a[a>4]
⇒>4の要素からなるarrayを返す
⇒代入すれば条件に合った要素をすべて書き換えることができる

※指定範囲へのサチュレーションした別のarrayを返す
例)
a.clip(1,2)

※NaN
定数
numpy.NAN ノットアナンバ。。。浮動小数

①numpy.isnan()静的メソッド
引数arrayの要素がNANであったら真となる真偽値のarrayを返す

②上記の否定ををインデックス配列として使えば数値のみとりだせる
d[~np.isnan(d)]

※静的メソッド
numpy.mean()
│ arrayの平均を求める

_◇Pillow
Python Imaging Library

※image Python Imaging Library
PIL Python Imaging Library

_◇pygraphviz
Interface to the Graphviz

_◇pytz
World timezone definitions

_◇six
Python 2 and 3 compatibility library

_◇django
directory of reusable apps, sites

_◇mysql-connector-python

_◇turtle

_◇SciPy

⇒◆SciPy参照


◆ツール

_◇2to3
2.xコード => 3.xコード反感

ライブラリとしては lib2to3
ツールとしては、Tools/scripts/2to3


◆SciPy

http://scipy.org
│ 数値計算用モジュール

_◇numpyを使った入出力

例)tsvファイルの読み込み
import scipy as sci
data = sci.genfromtxt(“web_traffic.tsv”, delimiter=”\t”)

⇒読み込んだデータの最初の10個を表示
print(data[:10])

⇒読み込んだデータの形を確認
print (data.shape)

⇒読み込んだ2次元データを次元毎に分割

x = data[:,0]
y = data[:,1]

_◇データの整形

例)系列yに含まれるnanの個数を数える

sci.isnan(y)で 各要素がnanか否かの真偽値のリストが得られる
それをsci.sumで集計するとTrue要素の数が求まる

sci.sum(sci.isnan(y))

例)系列yの要素がnanの部分のデータを排除する
sci.isnan(y) リストの否定 ~sci.isnan(y) リストを使ってnan以外の要素を抜き出す

x=x[~sci.isnan(y)]
y=y[~sci.isnan(y)]

_◇cluster
階層クラスタリング、ベクトル量子化/K平均化法

_◇constants
物理数学定数

_◇fftpack
フーリエ変換

_◇integrate
積分

_◇interpolate
補間

_◇io
データ入出力

_◇linalog
線形代数(BLAS, LAPACK)

_◇maxentropy
エントロピー分布

_◇ndimage
n次元画像パッケージ

_◇odr
直交距離回帰

_◇optimize
最適化

①fsolve
関数の根を求める
fsolve(func, x0)
│ func … 関数。poly1dなどで作成した多項式でもよい
│ x0 … 解の初期値

例)データを2次式にフィットさせたものについて、yが100000となるxを求める
fbt2 = sp.poly1d(sp.polyfit(xb[train], yb[train], 2))
fsolve(fbt2-100000, 800)

_◇signal
信号処理

_◇sparse
疎行列

_◇sparial
空間データ構造とアルゴリズム

_◇special
ベッセル関数、ヤコビアンなど特殊関数

_◇stats
統計


◆scikit-learn
機械学習のためのツールキット


◎実行環境


◆インタプリタの起動と終了

_◇Linux系

_◇Android

_◇Windows コマンドプロンプト

※インタプリタ
python -c コマンド [引数]
でコマンドを実行する。通常はコマンド部をシングルクウォートで囲む

python -m モジュール名 [引数]
でモジュールを独立したスクリプトとして実行することもできる

python -i スクリプトファイル名
でスクリプトを走らせた後に対話モードに入る

※終了
プライマリプロンプトが出ているときに、EOF(ファイル終端キャラクタ)^Zを入力
⇒インタプリタは0を返して終了する
⇒import sys; sys.exit() でもよい

_◇Windows GUI


◆コマンドライン引数

引数は変数 sys.argv として渡される

※スクリプト名も引数も与えられないとき
sys.argv[0] 空文字列

※スクリプト名が – (標準入力)
sys.argv[0] –

※-c コマンド形式
sys.argv[0] -c

※-m モジュール名
sys.argv[0] モジュールのファイル名


◆プロンプト

※プライマリプロンプト
>>>
※セカンダリプロンプト(継続行)

※複数行で論理構成する場合には、継続行が必要となる
※コマンドラインから入力の場合、ブロックの終端には空行が必要となる

_◇対話モードで有効なビルトイン変数

※アンダースコア変数
最後に表示した式を保持する。
リードオンリとするべき。
代入すると、ビルトイン変数を隠蔽する同名のローカル変数が生成されてしまう。


◆エラー処理

エラーが起きると、インタプリタはエラーメッセージとスタックトレースを標準エラー出力に表示する
⇒対話モードならプライマリプロンプトに戻る
⇒入力がファイルから来ているときは、0でない終了状態を返して終了する

※割り込みキャラクタ(^C)
⇒入力時は入力をキャンセルしてプライマリプロンプトに戻る
⇒コマンド実行中は KeyboardInterrupt例外となる
⇒これをtry文で処理することも可能


◆スクリプトの記法

_◇実行可能
BSDライクなUNIX系システム

スクリプトの先頭行
#!/usr/bin/env python3.1
などとする。スクリプトには実行パーミッションを与えておかねばならない

※Windowsの場合
.pyをpython.exe に関連づけると良い。
.pyw ⇒ 通常コンソールウインドウの表示が抑制される

_◇ソースコードエンコーディング

Python 3以降、UTF-8がデフォルト
Python 2系はそうではない

#!につづく行にソースファイルのエンコーディング定義を行う

# -*- coding: cp-1252 -*-


◆環境変数

_◇PYTHONSTARTUP
対話型セッションでの起動時の実行コマンド群を記したファイルを指定する
⇒ここでimportされたオブジェクトは対話セッションの中で無条件に使える

※グローバルなスタートアップファイルからのカレントディレクトリの追加のスタートアップファイルの読み込み

import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    exec(open(filename).read())


◆モジュールのインストール

_◇easy_install
setuptools

① ez_setup.pyをダウンロード
② ez_setup.pyを実行
⇒easy_installコマンドが使用できる

_◇pip

① easy_installを使ってpipをインストールする
$ easy_install pip

②使用方法
pip list インストールされているパッケージをリスト
pip freeze

pip install パッケージ名

pip uninstall パッケージ名

pip help ヘルプ表示

※pipの更新
pip install -U pip

※ .whlファイルのインストール

pip install xxx.whl


◎コーディングスタイル


◆PEP 8

①インデントはスペース4つ、タブは使わない
②79文字以下で行を折り返す
③関数やクラス、関数内の大き目のブロックを分離するのは空白行
④可能ならコメントはそれ自体の行に
⑤docstringを使う
⑥演算子の周囲、コンマの後ろにはスペースを入れる。かっこの内側には入れない
⑦クラスは単語の頭文字を大文字にして接続するスタイル、関数やメソッドは、小文字の単語同士をアンダースコアでつなぐ
⑧メソッドの第一引数としては常にselfを使う
⑨UTF-8かプレーンASCIIでコード
⑩国際化するなら非ASCIIキャラクタを使わない