(続き)「エキスパートPythonプログラミング読書会 第二期 02」参加してきました。¶
感想は前回述べたので、今回は本編についてのまとめ
●リスト内包表記
-mapより速い
前はmapを使っていたが、mapはあくまで関数
リスト内包表記は内部処理としてあるので、リストの方が早い
-enumerate関数
ループ処理でインデックスやカウンタを使いたい時に便利
-リスト内包表記は慣れると書きやすて便利
だけど可読性が低くなるときはfor文などの読みやすい方にする
そのほうがPythonic
●イテレータ
-nextメソッド、__iter__メソッド
プロトコルに問い合わせる関数
-「プロトコル = アダプター」
lenもアダプター
シンタックスの分かりやすさを、
”アダプターをかましている”という考えだとしっくりくるかなと
-イテレータプロトコルはどこで誰が定義したの?
→リファレンスマニュアルに規約が乗っている
→いまだとabc(抽象基底クラス)や仮想クラスのような形で、
に乗っている
ここを満たしていると、よりモダンな感じになる
-たとえると、
単にラップされていて、
必要なものに必要な処理をするための橋渡しをしている
コンセントのアダプタを意識すると分かりやい
(海外にいくと必要)
プロトコルに対応されていると、
それはイテレータであることを保証している
(ダックタイピングの話)
ただそれだとゆるすぎるから、
isインスタンスで証明できるようにしている
改行コードを受けった時に改行単位で、行読み出しなど
好きな単位でnextで読み込みできる組み込みでもある
関数など使わなくても、for文回せばいいのねという認識になる
●ジェネレータ
-yield
yieldがあるとジェネレータになる関数ではない
returnだと関数になるが、
yieldだとジェネレータの中にreturn書くなと怒られる
-StopIterationはお約束で、ループを抜けるために必要
-ジェネレータはイテレータプロトコルを実装しているので、
多段にyieldとかやるとメモリをほとんど食わずに、
ほぼ無限長のものを扱える
20GBのログなども落ちずにできると思う
-フィルタ条件とか色々かましたくなってくると便利になってくる
-sendメソッド
ジェネレータを外からコントロールすることは不可能だったけど
Python2.5でsendメソッドを搭載したので、
コントロールできるようになった
初期化の時はsendは使えない
最初にnext使ってやらないといけない
ジェネレータのそれ以降の動きを方向転換することができるのが、
sendのいいところ
-closeメソッド
close()を渡すとexceptionを発生させる→finallyで拾う
●PEP
-Python Enhancement Proposal(Python拡張提案)
-PEPはPythonのモダンな仕組みを取り入れるためのもの
-PEP8はPythonのコーディング規約を書いたもの
●ジェネレータ式
-リスト内包表記だと最初にメモリを食ってしまうため、
順次処理ならジェネレーターで
-順次処理系だとDBで1行(カーソル)を取り出していって、
ジェネレーターでやると10万行一気に読みこまないで済むので便利
●range()とxrange()の違い
-xrange()はオブジェクトを返している
-xrange()はPython3でrange()になるためいらないと思われ
-清水川せんせはほとんど使っていない
-10万のrange() を作る時は有効ではある
取っていたメモを元に書いてみました。
過不足ありそうですが、ひとまずこれにて振り返り終了。
@tfmagicianさんのツイートにもあったけど、
清水川せんせのライブコーディングのログがあったらなあと。
ブログ書いてて思い出せない所があったりして、
もどかしい思いもしたので次回からは是非残して欲しいと思う。