2010/10/5(Tue.) t2y
2010/10/5(Tue.) t2y
2.1 リスト内包表記
2.2 イテレータとジェネレータ ジェネレータ、コルーチン、ジェネレータ式
itertools モジュール
2.3 デコレータ 引数チェック、キャッシュ、プロキシ、その他
2.4 with と contextlib contextlib モジュール
2.5 まとめ
P. 62 ~
P. 64 ~
P. 76 ~
P. 88 ~
P. 93 ~
イテレータ
繰り返し要素を返すオブジェクトのこと
ジェネレータ
yield 文を使用して関数を一時停止させ、途中の結果を生成する
for j in [i for i in range(3)]:print j イテレータ
ジェネレータ
def generator():for i in [0, 1, 2]:
yield i
for i in generator():print i
イテレータを返す関数を提供するモジュール
islice: ウィンドウイテレータ
入力イテレータをスライシングしてイテレータを返す
tee: 前後方イテレータ
オリジナルの入力イテレータから複数の独立したイテレータを返す(tee コマンド)
groupby: ユニークイテレータ
グループ化した値セットのイテレータを返す(uniq コマンド)
その他の関数
ピュア Python で動作の説明がある07
イテレータを組み合わせる
itertools の関数を入力イテレータに使用することで様々な用途に応用ができそう
imap/izip や starmap で連携
パフォーマンス
メモリ効率が良いので速くなる
08
P.75 他の関数
デコレータ(decorator)
関数やメソッドのラッピング処理の見た目を分かり易くする
デコレータ構文を使用しなくても同処理が書ける
デコレータの良いプラクティス
汎用的なラッパーとなる処理
ラップした関数の引数、返り値を見るようにして、できるだけその関数の内部を解析しないようにすべき
関数の pre/post 処理を実装する
1つのモジュール内にまとめる
P.76 - 79
P.79 Note
09
XML-RPC プロトコル
引数を取るデコレータ
デコレータ内の処理結果を使いたいときはグローバル変数を使うしかない?
関数内部を解析しないようにすべき?
P.80 - 81
def xmlrpc(in_=(), out(type(None),)):def _xmlrpm(function):
def __xmlrpc(*args):return function(*args)
retrun __xmlrpcreturn _xmlrpc
キャッシュデコレータ
関数型プログラミングの特徴
出力が内部状態の影響を受けない
引数から必ず一意な結果が算出される
関数を呼び出さず、キャッシュの値を返す
やっぱりキャッシュはグローバル変数
メモ化(memoizing)
たらいを回すならHaskell
Python でもチャンレンジしてみよう
P.82 - 84
プロキシデコレータ
Web フレームワークのセキュリティを確保する仕組みに利用される?
Django での使用例
login_required デコレータ
permission_required デコレータ
P.85
コンテキストデコレータ
正しい実行コンテキストでの実行を保証
例) スレッドのロック
デコレータでなくても with 文でできるよ
Python 2.6 以降
P.86
Python デコレータライブラリ
インスタンスへメソッドを追加する
こんな状況あるかな?
引数の情報収集Oreilly2sphinx
ハンドラ登録
プログラム終了時に実行する
引数のカッコが省略可能なデコレータの実装方法
P.87
with 文
try...finally の置き換え
ファイルを閉じる
ロックを解除する
一時的にコードにパッチをあてる
特定環境で保護されたコードを実行する
2つのメソッドを実装したプロトコル __enter__: with ブロックに入るときに何かする、大抵は self を返す
__exit__: with ブロックを出るときに何かする、クリーンナップ
P.88-90
デコレータのコンテキストプロバイダと同様に pre/post 処理を行う
10
with 文のヘルパー関数を提供
contextmanager が役に立つ
yield 文で分割
yield より前: __enter__ の処理 yiled が生成した値は as で指定した変数へセット
yield より後: __exit__ の処理
closing: close メソッドの呼び出しを保証する
ストリームを扱うクラスに役立つ、例) urllib.urlopen
nested: コンテキストを結合してネストされた with を扱う
P.91-92
11
リスト内包表記は便利だよ!
イテレータとジェネレータで効率的に!
デコレータで新たなコードパターンが!
try...finally に代わり with 文を!
P.93