note.nkmk.me

『Effective Python』は目次にピンときたら読むべき本

Posted: 2018-05-08 / Modified: 2020-07-18 / Tags: 本・書籍, Python

『Effective Python 第2版 ―Pythonプログラムを改良する90項目』は文字通り効果的(Effective)なPythonプログラムを書くためのベストプラクティス、ノウハウをまとめた本。

初版(2016年1月)から大幅に内容が追加された第2版が2020年7月に発売された。

GitHubでサンプルコードが公開されている。

まずは目次で項目を確認してから買うかどうかを決めるのがおすすめ。

  • 目次(項目一覧)
  • こんな人にオススメ
  • こんな人にはオススメできない
  • 初版と第二版の違い
  • まとめ
スポンサーリンク

目次(項目一覧)

オライリー・ジャパンの公式サイトに目次が掲載されている。項目が見出しになっているので90項目すべてが確認できる。

1章 Pythonic思考
項目1 使用するPythonのバージョンを知っておく
項目2 PEP 8スタイルガイドに従う
項目3 bytesとstrの違いを知っておく
項目4 Cスタイルフォーマット文字列とstr.formatは使わずf 文字列で埋め込む
項目5 複雑な式の代わりにヘルパー関数を書く
項目6 インデックスではなく複数代入アンパックを使う
項目7 rangeではなくenumerateを使う
項目8 イテレータを並列に処理するにはzipを使う
項目9 forループとwhileループの後のelseブロックは使わない
項目10 代入式で繰り返しを防ぐ

2章 リストと辞書
項目11 シーケンスをどのようにスライスするか知っておく
項目12 1つの式では、ストライドとスライスを同時に使わない
項目13 スライスではなくcatch-allアンパックを使う
項目14 key引数を使い複雑な基準でソートする
項目15 dictの挿入順序に依存する場合は注意する
項目16 辞書の欠損キーの処理にはinやKeyErrorではなくgetを使う
項目17 内部状態の欠損要素を扱うにはsetdefaultではなくdefaultdictを使う
項目18 _ missing _ でキー依存デフォルト値を作成する方法を把握しておく

3章 関数
項目19 複数の戻り値では、4個以上の変数なら決してアンパックしない
項目20 Noneを返すのではなく例外を送出する
項目21 クロージャが変数スコープとどう関わるかを把握しておく
項目22 可変長位置引数を使って、見た目をすっきりさせる
項目23 キーワード引数にオプションの振る舞いを与える
項目24 動的なデフォルト引数を指定するときにはNoneとdocstringを使う
項目25 キーワード専用引数と位置専用引数で明確さを高める
項目26 functools.wrapsを使って関数デコレータを定義する

4章 内包表記とジェネレータ
項目27 mapやfilterの代わりにリスト内包表記を使う
項目28 内包表記では、3つ以上の式を避ける
項目29 代入式を使い内包表記での繰り返し作業をなくす
項目30 リストを返さずにジェネレータを返すことを考える
項目31 引数に対してイテレータを使うときには確実さを優先する
項目32 大きなリスト内包表記にはジェネレータ式を考える
項目33 yield fromで複数のジェネレータを作る
項目34 sendでジェネレータにデータを注入するのは避ける
項目35 ジェネレータでthrowによる状態遷移を起こすのは避ける
項目36 イテレータとジェネレータの作業ではitertoolsを使う

5章 クラスと継承
項目37 組み込み型の深い入れ子にはせずクラスを作成する
項目38 単純なインタフェースにはクラスの代わりに関数を使う
項目39 @classmethodポリモルフィズムを使ってオブジェクトをジェネリックに構築する
項目40 superを使ってスーパークラスを初期化する
項目41 Mix-inクラスで機能合成を考える
項目42 プライベート属性よりパブリックな属性が好ましい
項目43 カスタムコンテナ型はcollections.abcを継承する

6章 メタクラスと属性
項目44 getメソッドやsetメソッドは使わず属性をそのまま使う
項目45 属性をリファクタリングする代わりに@propertyを考える
項目46 再利用可能な@propertyメソッドにディスクリプタを使う
項目47 遅延属性には_ getattr , _ _getattribute , _ _setattr _ を使う
項目48 サブクラスを_ init_subclass _ で検証する
項目49 クラスの存在を_ init_subclass _ で登録する
項目50 クラス属性に_ set_name _ で注釈を加える
項目51 合成可能なクラス拡張のためにはメタクラスではなくクラスデコレータを使う

7章 並行性と並列性
項目52 subprocessを使って子プロセスを管理する
項目53 スレッドはブロッキングI/Oに使い、並列性に使うのは避ける
項目54 スレッドにおけるデータ競合を防ぐためにLockを使う
項目55 スレッド間の協調作業にはQueueを使う
項目56 並行性が必要な場合をどのように認知するかを知っておく
項目57 オンデマンドファンアウトのために新たなThreadインスタンスを作るのを避ける
項目58 並行性のためにQueueを使うと、どのようにリファクタリングが必要になるかを理解する
項目59 並行性のためにスレッドが必要なときにはThreadPoolExecutorを考える
項目60 コルーチンで高度な並行I/Oを達成する
項目61 スレッドI/Oをasyncioにどう移行すればよいか知っておく
項目62 スレッドとコルーチンを組み合わせてasyncioへの移行を楽にする
項目63 応答性を最大化するためにasyncioイベントループのブロッキングを避ける
項目64 本当の並列性のためにconcurrent.futuresを考える

8章 頑健性と性能
項目65 try/except/else/finallyの各ブロックを活用する
項目66 contextlibとwith文をtry/finallyの代わりに考える
項目67 ローカルクロックにはtimeではなくdatetimeを使う
項目68 copyregでpickleを信頼できるようにする
項目69 精度が特に重要な場合はdecimalを使う
項目70 最適化の前にプロファイル
項目71 生産者消費者キューにはdequeのほうがよい
項目72 ソート済みシーケンスの探索にはbisectを考える
項目73 優先度付きキューでheapqの使い方を知っておく
項目74 bytes型のゼロコピー処理にはmemoryviewとbytearrayを考える

9章 テストとデバッグ
項目75 出力のデバッグにはrepr文字列を使う
項目76 関係する振る舞いをTestCaseサブクラスで検証する
項目77 setUp, tearDown, setUpModule, tearDownModuleで他からテストを分離する
項目78 モックを使って依存性が複雑なコードをテストする
項目79 モックとテストを活用して依存性をカプセル化する
項目80 pdbで対話的にデバッグすることを考える
項目81 メモリの使用とリークを理解するにはtracemallocを使う

10章 協働作業(コラボレーション)
項目82 コミュニティのモジュールをどこで見つけられるかを知っておく
項目83 隔離された複製可能な依存関係のために仮想環境を使う
項目84 すべての関数、クラス、モジュールについてdocstringを書く
項目85 モジュールの構成にパッケージを用い、安定したAPIを提供する
項目86 実施環境を構成するのにモジュールスコープのコードを考える
項目87 APIからの呼び出し元を分離するために、ルート例外を定義する
項目88 循環依存を取り除く方法を知る
項目89 リファクタリングと利用のマイグレーションにwarningsを考える
項目90 バグを回避するために静的解析を検討する
O'Reilly Japan - Effective Python 第2版

こんな人にオススメ

目次を見て気になる項目がいくつかあれば買って損はない。

  • 1章 Pythonic思考
  • 2章 リストと辞書
  • 3章 関数
  • 4章 内包表記とジェネレータ

は、基本的ながら見落としがちな項目が多い。また、

  • 5章 クラスと継承
  • 6章 メタクラスと属性
  • 7章 並行性と並列性
  • 8章 頑健性と性能
  • 9章 テストとデバッグ
  • 10章 協働作業(コラボレーション)

は、ほかのPython書籍ではあまり触れられていない実践的な内容。

どの項目もサンプルコードともに「なぜこのようにすべきなのか」という理由(筆者の考え)がちゃんと書かれていて納得感がある。

それぞれの項目は独立しているので、気になるところだけ読むという読み方もできる。

こんな人にはオススメできない

目次の項目を見ても何が何だか分からなければ、あわてて読む必要はない。

Pythonの基本的な説明はされていないので、Python初学者がいきなり読むには厳しいだろう。他の入門書的な本で基礎文法を把握してから読んだほうが理解しやすいと思う。

ただ、特に1〜4章は早めに知っておくと役に立つ内容も多く、それほど難しくもない。入門書の次のステップとしては良いかもしれない。

なお、Python初心者向けの入門書としては『みんなのPython』がおすすめ。

初版と第二版の違い

初版のタイトルは『Effective Python ―Pythonプログラムを改良する59項目』で、第二版は『Effective Python 第2版 ―Pythonプログラムを改良する90項目』。

タイトルから分かるように、59項目から90項目へと大幅に加筆されている。それに伴いページ数も256ページから456ページに増加。手にとると厚みの違いが明らかに分かるレベル。

f文字列(Python3.6で追加)やウォルラス演算子:=(Python3.8で追加)も紹介されており、最新のPythonに対応した内容となっている。また、標準ライブラリのbisectモジュールやheapqモジュールといった初版ではサラッと触れられていただけの項目もより詳細に解説されている。

新しく購入するのであれば当然ながら第二版がオススメ。初版が古本で安くなっていたとしても絶対に第二版のほうがいい。

内容がかなり大幅に追加されているので、初版を持っているという人も気になる項目があれば購入に値するだろう。とはいえ、安い本ではない(2020年7月18日現在Amazonで3960円)ので、GitHubのサンプルコードを見て自分が知りたい内容かどうかを確認しておくとよいかもしれない。

まとめ

公開されている目次で項目を確認してから買うかどうかを決めるのがいい。

「なぜそれが効果的(Effective)なんだろう?」と疑問に思う項目があれば読んでみてほしい。

原著(英語版)はKindle版もあり。

スポンサーリンク
シェア
このエントリーをはてなブックマークに追加

関連カテゴリー

関連記事