エキスパートPythonプログラミング読書会03に行ってみた

"エキスパートPythonプログラミング読書会03 : ATND"に参加してみました。

前回の復習

イテレータとジェネレータは包含関係にあります。

itertools(アイターツールズ)

イテレータを返す関数群の塊です。
まとめ、イテレータにするとメモリの使用率がよくなります。
そのため、大量のデータを処理する場合に効力を発揮します。

islice

引数が2つだと、リスト、停止位置になります。
引数が3つだと、リスト、開始位置、停止位置になります。
引数が4つだと、りすと、開始位置、終了位置、刻みになります。

tee

teeコマンド、標準出力にだしながらファイルににも出力させることができます。
echo "abc" | tee log.txt
abcが出力され、log.txtが作成されabcが書き出されます。

イテレータを複製して返します。
引数が2つだと、リスト、複製する数になります。
注意事項:メモリ領域の使用料に注意が必要です。
元のリストを変更してしまうとイテレータ側にも影響が出ます。

groupby

隣接する要素をuniqにします。
隣接してないと思った通りにならないことがあります。
"aabab | uniq"と"aabab | sort | uniq"は違うのと同じです。

izip

zipで返り値がイテレータになります。
大量のデータを処理すると、izipの方が早い。ただし、3件程度だとzipの方が早い。
メモリの使用量の問題だろうという見解でした。

imap

mapで返り値がイテレータになります。

count

引数の値から無限にカウントアップした値を返すイテレータを返す関数です。

デコレータ

導入された理由は、見た目をわかりやすくするためです。うーん、シンプル。
@classmethodとか@staticmethodって見るだけで意味がわかる方がいいじゃんってことみたい。
python.orgのwikiにデコレータの使用例がまとまったサイトがあります。
複数のデコレータをつけた場合、下から実行されます。
デコレータは1行に1つしか記述できません。これは文法です。

デコレート:キャッシュ

関数型プログラミングの特徴らしい。へぇー。

デコレータ:プロキシ

Djangoのログインチェックのデコレータの話がでてました。

with

使ったことねーっす。
最近のライブラリで、try-finallyで処理させたいものは、__enter__と__exit__が
実装されているようです。そのため、withを使ってシンプルに書けるようになってる。
オブジェクトに__enter__と__exit__を実装しなければならないのが少々面倒です。
ライブラリーレベルのモジュールを作る場合にはwithを意識してもよいかもしれません。
その場合、withの使用を進めるべきなのでしょう。

withがあるからといって、try-finallyが無くなる方向ではないです。
繰り返し同じtry-finallyの記述が必要な場合、別に切り出すぐらいに考える。

contextlib

contextmanagerってパッと見へんてこりんですね。
ジェネレーターの特性を使って実現しているものです。
contextmanagerだと、__enter__と__exit__が関数にありませんでした。なぜ?
dirが関数自体になってたから。enterとexitは関数の呼び出し結果にあります。

loginデコレータをすべてのクラスに付けるのがめんどい場合、メタプログラミングで強制的に付けてしまうことは可能です。