More Related Content Similar to エキ Py 読書会02 2010/9/7 Similar to エキ Py 読書会02 2010/9/7 (20) More from Tetsuya Morimoto More from Tetsuya Morimoto (15) エキ Py 読書会02 2010/9/72. 2.1 リスト内包表記 P. 62 ~
2.2 イテレータとジェネレータ P. 64 ~
ジェネレータ、コルーチン、ジェネレータ式
itertools モジュール
2.3 デコレータ P. 76 ~
引数チェック、キャッシュ、プロキシ、その他
2.4 with と contextlib P. 88 ~
contextlib モジュール
2.5 まとめ P. 93 ~
3. 第2章には
P.61
使ってみたくなる
ツール類が
たくさんあります
4. リスト内包表記
>>> [i for i in range(0,3)]
P.62 訳注
[0, 1, 2]
Python の内包表記はなぜ速い?
append 属性の取り出し バイトコード
関数の呼び出し 命令数の削減
使えるなら使った方が良い
5. P.63 コード
enumerate() 関数に感激!
ループ処理でインデックスやカウンタを使用した
いときに便利
01
Pythonic な構文とは何か?
小さなコードパターンに対して、もっとも効率的な
イディオムを使用した構文
6. P.64 -65
イテレータ(iterator)
繰り返し要素を返すオブジェクトのこと
2つのメソッドを実装したオブジェクト
next() メソッド(Python3 では __next__)
__iter__ メソッド
- 英単語のおさらい
iterate: 繰り返す、反復する
iterable: 繰り返し可能な(モノ)
iteration: イテレーション
iterative: 反復の
iterant: 反復する
7. wikipedia:ジェネレータ(generator)
特殊なサブルーチン
関数に似ているが、イテレータのように振る舞う
エキPy: ジェネレータ P.65 下段
ジェネレータは yield 文を使用して、
関数を一時停止させ、途中経過の結果を返す
02
-英単語のおさらい
generate: 生む、発生させる
yield: 産出する、生み出す
8. ジェネレータの用途
イテレータを作成する
巨大なデータを扱い易い(省メモリ)
03
途中経過を利用できる
無限に続く特性を持つアルゴリズムを扱う
フィボナッチ数列のような数値計算
ファイル/テキスト/バイナリストリームの扱い
“ループ処理やシーケンスを返す関数を
実装するときには、まずジェネレータの
利用を検討すべきです”
9. Python Enhancement Proposal
P.66 Note
(Python 拡張提案)
Python に変更を加えるための提案書
PEP1: PEP の目的とガイドライン
PEP3138: Python3000 の文字列表現
石本さんの発表資料
10. P.68-69
ジェネレータの新メソッド
send: ジェネレータへ値を渡す
04
throw: ジェネレータへ例外を送る
close: ジェネレータに GeneratorExit を発生させる
Online Python Tutor
3つのメソッドを使用して P.69-71
コルーチンを実装する
PEP342: 拡張ジェネレータによるコルーチン
11. ジェネレータ式(genexp) P.72 真ん中
>>> (i for i in range(0,3))
<generator object <genexpr> at 0x94b907c>
“yield を使用したシンプルなルー
プや、イテレータのように動作するリ
スト内包表記は、積極的にジェネ
レータ式に置き換えるべきです”
12. イテレータを返す関数を提供するモジュール
islice: ウィンドウイテレータ
入力イテレータをスライシングしてイテレータを返す
tee: 前後方イテレータ
オリジナルの入力イテレータから複数の独立したイテレータ
を返す(tee コマンド)
groupby: ユニークイテレータ
グループ化した値セットのイテレータを返す(uniq コマンド)
その他の関数
05
ピュア Python で動作の説明がある
13. P.75 他の関数
イテレータを組み合わせる
itertools の関数を入力イテレータに使用するこ
とで様々な応用例が考えられる
06
imap/izip や starmap で連携
パフォーマンス
14. P.76 - 79
デコレータ(decorator)
関数やメソッドのラッピング処理の見た目を分かり
易くする
デコレータ構文を使用しなくても同処理が書ける
デコレータの良いプラクティス
P.79 Note
汎用的なラッパーとなる処理
ラップした関数の引数、返り値を見るようにして、できるだけそ
の関数の内部を解析しないようにすべき
関数の pre/post 処理を実装する
07
1つのモジュール内にまとめる
15. XML-RPC プロトコル P.80 - 81
引数を取るデコレータ
デコレータ内の処理結果を使いたいときはグロー
バル変数を使うしかない?
関数内部を解析しないようにすべき?
def xmlrpc(in_=(), out(type(None),)):
def _xmlrpm(function):
def __xmlrpc(*args):
return function(*args)
retrun __xmlrpc
return _xmlrpc
16. P.82 - 84
キャッシュデコレータ
関数型プログラミングの特徴
出力が内部状態の影響を受けない
引数から必ず一意な結果が算出される
関数を呼び出さず、キャッシュの値を返す
やっぱりキャッシュはグローバル変数
メモ化(memoizing)
08
たらいを回すならHaskell
17. P.85
プロキシデコレータ
Web フレームワークのセキュリティを確保する仕
組みに利用される?
Django での使用例
login_required デコレータ
permission_required デコレータ
18. P.86
コンテキストデコレータ
正しい実行コンテキストでの実行を保証
例) スレッドのロック
デコレータでなくても with 文でできるよ
Python 2.6 以降
19. Python デコレータライブラリ P.87
インスタンスへメソッドを追加する
こんな状況あるかな?
引数の情報収集
Oreilly2sphinx
ハンドラ登録
プログラム終了時に実行する
引数のカッコが省略可能なデコレータの実装方法
20. P.88-90
with 文
try...finally の置き換え
ファイルを閉じる
ロックを解除する
一時的にコードにパッチをあてる
特定環境で保護されたコードを実行する
2つのメソッドを実装したプロトコル
__enter__: with ブロックに入るときに何かする、大抵は self を返す
__exit__: with ブロックを出るときに何かする、クリーンナップ
デコレータのコンテキストプロバイダと 09
同様に pre/post 処理を行う
21. with 文のヘルパー関数を提供 P.91-92
contextmanager が役に立つ
yield 文で分割
yield より前: __enter__ の処理
yiled が生成した値は as で指定した変数へセット
yield より後: __exit__ の処理
closing: close メソッドの呼び出しを保証する
10
ストリームを扱うクラスに役立つ、例) urllib.urlopen
nested: コンテキストを結合してネストされた with を扱う