エキ py 読書会02 2章後半

14
2010/10/5(Tue.) t2y

Upload: tetsuya-morimoto

Post on 31-May-2015

1.036 views

Category:

Technology


0 download

DESCRIPTION

2010/10/5 の読書会でお話した内容です。

TRANSCRIPT

Page 1: エキ Py 読書会02 2章後半

2010/10/5(Tue.) t2y

Page 2: エキ Py 読書会02 2章後半

2.1 リスト内包表記

2.2 イテレータとジェネレータ ジェネレータ、コルーチン、ジェネレータ式

itertools モジュール

2.3 デコレータ 引数チェック、キャッシュ、プロキシ、その他

2.4 with と contextlib contextlib モジュール

2.5 まとめ

P. 62 ~

P. 64 ~

P. 76 ~

P. 88 ~

P. 93 ~

Page 3: エキ Py 読書会02 2章後半

イテレータ

繰り返し要素を返すオブジェクトのこと

ジェネレータ

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

Page 4: エキ Py 読書会02 2章後半

イテレータを返す関数を提供するモジュール

islice: ウィンドウイテレータ

入力イテレータをスライシングしてイテレータを返す

tee: 前後方イテレータ

オリジナルの入力イテレータから複数の独立したイテレータを返す(tee コマンド)

groupby: ユニークイテレータ

グループ化した値セットのイテレータを返す(uniq コマンド)

その他の関数

ピュア Python で動作の説明がある07

Page 5: エキ Py 読書会02 2章後半

イテレータを組み合わせる

itertools の関数を入力イテレータに使用することで様々な用途に応用ができそう

imap/izip や starmap で連携

パフォーマンス

メモリ効率が良いので速くなる

08

P.75 他の関数

Page 6: エキ Py 読書会02 2章後半

デコレータ(decorator)

関数やメソッドのラッピング処理の見た目を分かり易くする

デコレータ構文を使用しなくても同処理が書ける

デコレータの良いプラクティス

汎用的なラッパーとなる処理

ラップした関数の引数、返り値を見るようにして、できるだけその関数の内部を解析しないようにすべき

関数の pre/post 処理を実装する

1つのモジュール内にまとめる

P.76 - 79

P.79 Note

09

Page 7: エキ Py 読書会02 2章後半

XML-RPC プロトコル

引数を取るデコレータ

デコレータ内の処理結果を使いたいときはグローバル変数を使うしかない?

関数内部を解析しないようにすべき?

P.80 - 81

def xmlrpc(in_=(), out(type(None),)):def _xmlrpm(function):

def __xmlrpc(*args):return function(*args)

retrun __xmlrpcreturn _xmlrpc

Page 8: エキ Py 読書会02 2章後半

キャッシュデコレータ

関数型プログラミングの特徴

出力が内部状態の影響を受けない

引数から必ず一意な結果が算出される

関数を呼び出さず、キャッシュの値を返す

やっぱりキャッシュはグローバル変数

メモ化(memoizing)

たらいを回すならHaskell

Python でもチャンレンジしてみよう

P.82 - 84

Page 10: エキ Py 読書会02 2章後半

コンテキストデコレータ

正しい実行コンテキストでの実行を保証

例) スレッドのロック

デコレータでなくても with 文でできるよ

Python 2.6 以降

P.86

Page 11: エキ Py 読書会02 2章後半

Python デコレータライブラリ

インスタンスへメソッドを追加する

こんな状況あるかな?

引数の情報収集Oreilly2sphinx

ハンドラ登録

プログラム終了時に実行する

引数のカッコが省略可能なデコレータの実装方法

P.87

Page 12: エキ Py 読書会02 2章後半

with 文

try...finally の置き換え

ファイルを閉じる

ロックを解除する

一時的にコードにパッチをあてる

特定環境で保護されたコードを実行する

2つのメソッドを実装したプロトコル __enter__: with ブロックに入るときに何かする、大抵は self を返す

__exit__: with ブロックを出るときに何かする、クリーンナップ

P.88-90

デコレータのコンテキストプロバイダと同様に pre/post 処理を行う

10

Page 13: エキ Py 読書会02 2章後半

with 文のヘルパー関数を提供

contextmanager が役に立つ

yield 文で分割

yield より前: __enter__ の処理 yiled が生成した値は as で指定した変数へセット

yield より後: __exit__ の処理

closing: close メソッドの呼び出しを保証する

ストリームを扱うクラスに役立つ、例) urllib.urlopen

nested: コンテキストを結合してネストされた with を扱う

P.91-92

11

Page 14: エキ Py 読書会02 2章後半

リスト内包表記は便利だよ!

イテレータとジェネレータで効率的に!

デコレータで新たなコードパターンが!

try...finally に代わり with 文を!

P.93