エキ py 読書会02 2010/9/7
TRANSCRIPT
2010/9/7(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 ~
使ってみたくなるツール類が
たくさんあります
第2章には
P.61
リスト内包表記
>>> [i for i in range(0,3)]
[0, 1, 2]
Python の内包表記はなぜ速い?
append 属性の取り出し
関数の呼び出し
バイトコード命令数の削減
使えるなら使った方が良い
P.62 訳注
enumerate() 関数に感激!
ループ処理でインデックスやカウンタを使用したいときに便利
Pythonic な構文とは何か?
小さなコードパターンに対して、もっとも効率的なイディオムを使用した構文
01
P.63 コード
イテレータ(iterator)
繰り返し要素を返すオブジェクトのこと
2つのメソッドを実装したオブジェクト
next() メソッド(Python3 では __next__)
__iter__ メソッド
- 英単語のおさらいiterate: 繰り返す、反復するiterable: 繰り返し可能な(モノ)iteration: イテレーションiterative: 反復のiterant: 反復する
P.64 -65
wikipedia:ジェネレータ(generator)
特殊なサブルーチン
関数に似ているが、イテレータのように振る舞う
エキPy: ジェネレータ
ジェネレータは yield 文を使用して、
関数を一時停止させ、途中経過の結果を返す
-英単語のおさらいgenerate: 生む、発生させるyield: 産出する、生み出す
02
P.65 下段
ジェネレータの用途
イテレータを作成する
巨大なデータを扱い易い(省メモリ)
途中経過を利用できる
無限に続く特性を持つアルゴリズムを扱う
フィボナッチ数列のような数値計算
ファイル/テキスト/バイナリストリームの扱い
“ループ処理やシーケンスを返す関数を
実装するときには、まずジェネレータの利用を検討すべきです”
03
Python Enhancement Proposal
(Python 拡張提案)
Python に変更を加えるための提案書
PEP1: PEP の目的とガイドライン
PEP3138: Python3000 の文字列表現
石本さんの発表資料
P.66 Note
ジェネレータの新メソッド
send: ジェネレータへ値を渡す
throw: ジェネレータへ例外を送る
close: ジェネレータに GeneratorExit を発生させる
Online Python Tutor
3つのメソッドを使用して
コルーチンを実装する PEP342: 拡張ジェネレータによるコルーチン
P.68-69
P.69-71
04
ジェネレータ式(genexp)
>>> (i for i in range(0,3))
<generator object <genexpr> at 0x94b907c>
“yield を使用したシンプルなルー
プや、イテレータのように動作するリスト内包表記は、積極的にジェネレータ式に置き換えるべきです”
P.72 真ん中
イテレータを返す関数を提供するモジュール
islice: ウィンドウイテレータ
入力イテレータをスライシングしてイテレータを返す
tee: 前後方イテレータ
オリジナルの入力イテレータから複数の独立したイテレータを返す(tee コマンド)
groupby: ユニークイテレータ
グループ化した値セットのイテレータを返す(uniq コマンド)
その他の関数
ピュア Python で動作の説明がある05
イテレータを組み合わせる
itertools の関数を入力イテレータに使用することで様々な応用例が考えられる
imap/izip や starmap で連携
パフォーマンス
06
P.75 他の関数
デコレータ(decorator)
関数やメソッドのラッピング処理の見た目を分かり易くする
デコレータ構文を使用しなくても同処理が書ける
デコレータの良いプラクティス
汎用的なラッパーとなる処理
ラップした関数の引数、返り値を見るようにして、できるだけその関数の内部を解析しないようにすべき
関数の pre/post 処理を実装する
1つのモジュール内にまとめる
P.76 - 79
P.79 Note
07
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
P.82 - 84
08
プロキシデコレータ
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 処理を行う
09
with 文のヘルパー関数を提供
contextmanager が役に立つ
yield 文で分割
yield より前: __enter__ の処理 yiled が生成した値は as で指定した変数へセット
yield より後: __exit__ の処理
closing: close メソッドの呼び出しを保証する
ストリームを扱うクラスに役立つ、例) urllib.urlopen
nested: コンテキストを結合してネストされた with を扱う
P.91-92
10
リスト内包表記は便利だよ!
イテレータとジェネレータで効率的に!
デコレータで新たなコードパターンが!
try...finally に代わり with 文を!
P.93