エキ Py 読書会02 2010/9/7

22
2010/9/7(Tue.) t2y

Transcript of エキ Py 読書会02 2010/9/7

Page 1: エキ Py 読書会02 2010/9/7

2010/9/7(Tue.) t2y

Page 2: エキ Py 読書会02 2010/9/7

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 2010/9/7

使ってみたくなるツール類が

たくさんあります

第2章には

P.61

Page 4: エキ Py 読書会02 2010/9/7

リスト内包表記

>>> [i for i in range(0,3)]

[0, 1, 2]

Python の内包表記はなぜ速い?

append 属性の取り出し

関数の呼び出し

バイトコード命令数の削減

使えるなら使った方が良い

P.62 訳注

Page 5: エキ Py 読書会02 2010/9/7

enumerate() 関数に感激!

ループ処理でインデックスやカウンタを使用したいときに便利

Pythonic な構文とは何か?

小さなコードパターンに対して、もっとも効率的なイディオムを使用した構文

01

P.63 コード

Page 6: エキ Py 読書会02 2010/9/7

イテレータ(iterator)

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

2つのメソッドを実装したオブジェクト

next() メソッド(Python3 では __next__)

__iter__ メソッド

- 英単語のおさらいiterate: 繰り返す、反復するiterable: 繰り返し可能な(モノ)iteration: イテレーションiterative: 反復のiterant: 反復する

P.64 -65

Page 8: エキ Py 読書会02 2010/9/7

ジェネレータの用途

イテレータを作成する

巨大なデータを扱い易い(省メモリ)

途中経過を利用できる

無限に続く特性を持つアルゴリズムを扱う

フィボナッチ数列のような数値計算

ファイル/テキスト/バイナリストリームの扱い

“ループ処理やシーケンスを返す関数を

実装するときには、まずジェネレータの利用を検討すべきです”

03

Page 9: エキ Py 読書会02 2010/9/7

Python Enhancement Proposal

(Python 拡張提案)

Python に変更を加えるための提案書

PEP1: PEP の目的とガイドライン

PEP3138: Python3000 の文字列表現

石本さんの発表資料

P.66 Note

Page 10: エキ Py 読書会02 2010/9/7

ジェネレータの新メソッド

send: ジェネレータへ値を渡す

throw: ジェネレータへ例外を送る

close: ジェネレータに GeneratorExit を発生させる

Online Python Tutor

3つのメソッドを使用して

コルーチンを実装する PEP342: 拡張ジェネレータによるコルーチン

P.68-69

P.69-71

04

Page 11: エキ Py 読書会02 2010/9/7

ジェネレータ式(genexp)

>>> (i for i in range(0,3))

<generator object <genexpr> at 0x94b907c>

“yield を使用したシンプルなルー

プや、イテレータのように動作するリスト内包表記は、積極的にジェネレータ式に置き換えるべきです”

P.72 真ん中

Page 12: エキ Py 読書会02 2010/9/7

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

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

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

tee: 前後方イテレータ

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

groupby: ユニークイテレータ

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

その他の関数

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

Page 13: エキ Py 読書会02 2010/9/7

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

itertools の関数を入力イテレータに使用することで様々な応用例が考えられる

imap/izip や starmap で連携

パフォーマンス

06

P.75 他の関数

Page 14: エキ Py 読書会02 2010/9/7

デコレータ(decorator)

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

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

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

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

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

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

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

P.76 - 79

P.79 Note

07

Page 15: エキ Py 読書会02 2010/9/7

XML-RPC プロトコル

引数を取るデコレータ

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

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

P.80 - 81

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

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

retrun __xmlrpcreturn _xmlrpc

Page 16: エキ Py 読書会02 2010/9/7

キャッシュデコレータ

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

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

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

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

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

メモ化(memoizing)

たらいを回すならHaskell

P.82 - 84

08

Page 18: エキ Py 読書会02 2010/9/7

コンテキストデコレータ

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

例) スレッドのロック

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

Python 2.6 以降

P.86

Page 19: エキ Py 読書会02 2010/9/7

Python デコレータライブラリ

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

こんな状況あるかな?

引数の情報収集Oreilly2sphinx

ハンドラ登録

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

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

P.87

Page 20: エキ Py 読書会02 2010/9/7

with 文

try...finally の置き換え

ファイルを閉じる

ロックを解除する

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

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

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

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

P.88-90

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

09

Page 21: エキ Py 読書会02 2010/9/7

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

contextmanager が役に立つ

yield 文で分割

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

yield より後: __exit__ の処理

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

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

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

P.91-92

10

Page 22: エキ Py 読書会02 2010/9/7

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

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

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

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

P.93