チラウラヤーン3号

その辺のプログラマーのチラ裏です。

Python Cookbook読了

Python Cookbookをようやく通読し終えた。

600ページの本を、通読とは言え、始まりから終わりまで読み通したのは生まれて初めて。 期間的には約2ヶ月で、正味約30日かかった。感慨もひとしお。えーんえーん。

これからは「600ページある中難易度 (知らないことが半分ぐらい混ざっている) の技術書を通読するには目安として30日を要する」ことを覚えておきたい。

以下、メモ。

  • ユーモアを忘れずに (至る所でユーモラスな言い回しが含まれている)。
  • heystack.count(word)
  • it's easier to ask forgiveness than permission (EAFP)
    • easier to get forgiveness than permission / EGFP
  • predicate: 述語。戻り値がTrue/Falseである関数。Trueを返した場合に「述語が満たされている」という。
  • translateメソッドは使いようによっては便利
  • string.Templateクラスでテンプレーティングが自作できる
  • 良いコーディングのルール「やるんだったら一度だけ!」(once, and only once!)
  • 一つ違い = off-by-one
  • timeitを使いましょう。inplaceな方法と新規変数作成のどちらが速いか、など。
  • 1行ごとのストリーム処理用関数を作って、特にその結果がイテレーションで処理される場合、yieldが使えるよ p.73
  • マルチスレッドではロックをちゃんと理解して使おう
  • CRC計算は手軽にできるよ p.110
  • 会計処理にはDecimalを使おう
    • Decimalの「コンテキスト」の意義 → 他のスレッドに影響を与えることなく、ローカルスコープでのみ精度変更ができる p.118
  • 「曖昧さに直面した場合は、推測したくなる衝動を拒絶せよ」
  • 曜日定数は calendar.FRIDAY のようにcalendarモジュールで定義されています p.121
  • oneday = datetime.timedelta(days=1) ← やや見やすいかも
  • sum()って第二引数で初期値を与えられるんですよ。timedeltaを加算する場合に便利。 p.124
  • 「過剰な最適化はプログラミングにおける諸悪の根源」はKnuthがHoareの言葉を引用した。 (Hoare: 1960年代にプログラミングを数学的かつ科学的な手法として体系化した) p.130
  • 「エラーは、それを意図的にやり過ごすようにコーディングしていない限り、看過されてはならない」 p.136
  • schedモジュールの存在 (コマンドの予定実行、定期実行ができる) p.137
  • クレジットカード番号のチェックサム p.147
    • 少ない行数で可能。でもこれはベンダー側のAPIでやってくれると思うので、そっちに任せることの方が多そう
  • 100以上のものを100としたい: L[:] = [min(x, 100) for x in L] p.156
  • 遅延評価の別名: normal order / call by need, 先行評価の別名: applicative order / call by value p.157
  • yieldの効果的な例 p.162, p.173
  • ディクショナリのsetdefaultの使い方: d = {}; d.setdefault(word, []).append(number) p.169
  • アイテムごとに確率を定めたランダム抽出 (重み付け選択) p.188
  • DSUイディオム (修飾 - ソート - 脱修飾) p.199
  • ディクショナリのサブクラスの例 p.203
  • 含まれる数値で文字列をソート p.206
  • heapqモジュールの存在 p.209
  • bisectモジュールの存在 p.213
  • Knuth-Morris-Prratアルゴリズム (KMP) p.223 (大きなシーケンスからサブシーケンスを見つける)
  • UserDictクラス, DictMixinクラスの存在 p.225 -
  • itertools.groupbyメソッドの存在 p.229
  • 単一インスタンスを望むなら、PythonではOOPオブジェクトよりモジュールがベストなことが多い p.232
  • 変更不可の定数クラスの作成例 p.240 (でもまぁ、モジュールに定数を作るだけの方がシンプルだけど)
  • 属性の設定を制限 p.242
  • リングバッファ p.262 (うーん。。。複雑なような...)
    • collection.dequeueの存在にも触れられている
  • インスタンスの変更検知 p.265 (ORMオブジェクトのDirty判定実装とかでも使えそう。大概、すでに実装されているけど)
  • Stateデザインパターン p.272
  • __new__ の使用例 p.275
  • 「Borgの方法」 (シングルトン議論) p.276
  • Look Before You Leap (石橋を叩いて渡る) p.288
  • ブール変数 __debug__ の存在 p.339
  • メモリリーク調査のための、ガベージコレクションデバッグgc モジュール p.341
  • デバッガを通すと出現しないバグの調査で使えるかも p.344, p.347
    • tracebackモジュールを使って、処理過程で呼び出し、変更される情報を出力する
  • Kent Beck "do the simplest thing that could possibly work" (機能しそうで一番簡単なことをしろ) p.352
  • Queue.Queue ライブラリの存在 p.361, p.367-, p.444, p.518
  • fcntlモジュール, selectモジュールの使用例 p.389
  • 時間のかかる処理をするプログラムでは、実行タスクの進捗状況を視覚的にフィードバックしよう p.430
  • lambda を使わずコールバックを書く p.431
  • 少し実装に手間のかかりそうなネットワークプログラミングでは Twisted も検討してみよう p.516 - , p.560
  • ダイナミックIPアドレスのアップデート p.528
  • 「ロケットサイエンス」 = とても難しいこと。複数の学問の集大成のこと p.551
  • XML-RPCサーバーは結構かんたんに書ける p.575, p.582