エキスパートPythonプログラミング読書会03に行ってみた
"エキスパートPythonプログラミング読書会03 : ATND"に参加してみました。
前回の復習
イテレータとジェネレータは包含関係にあります。
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の方が早い。
メモリの使用量の問題だろうという見解でした。
count
引数の値から無限にカウントアップした値を返すイテレータを返す関数です。
デコレータ
導入された理由は、見た目をわかりやすくするためです。うーん、シンプル。
@classmethodとか@staticmethodって見るだけで意味がわかる方がいいじゃんってことみたい。
python.orgのwikiにデコレータの使用例がまとまったサイトがあります。
複数のデコレータをつけた場合、下から実行されます。
デコレータは1行に1つしか記述できません。これは文法です。
デコレート:キャッシュ
関数型プログラミングの特徴らしい。へぇー。
with
使ったことねーっす。
最近のライブラリで、try-finallyで処理させたいものは、__enter__と__exit__が
実装されているようです。そのため、withを使ってシンプルに書けるようになってる。
オブジェクトに__enter__と__exit__を実装しなければならないのが少々面倒です。
ライブラリーレベルのモジュールを作る場合にはwithを意識してもよいかもしれません。
その場合、withの使用を進めるべきなのでしょう。
withがあるからといって、try-finallyが無くなる方向ではないです。
繰り返し同じtry-finallyの記述が必要な場合、別に切り出すぐらいに考える。
contextlib
contextmanagerってパッと見へんてこりんですね。
ジェネレーターの特性を使って実現しているものです。
contextmanagerだと、__enter__と__exit__が関数にありませんでした。なぜ?
dirが関数自体になってたから。enterとexitは関数の呼び出し結果にあります。
loginデコレータをすべてのクラスに付けるのがめんどい場合、メタプログラミングで強制的に付けてしまうことは可能です。