発刊以来、多くのPythonエキスパートの支持を集め、増刷を重ねている書籍の待望の改訂版。ベストプラクティス、ヒント、落とし穴の避け方や達人プログラマのコード、新機能などを紹介し、堅牢でパフォーマンスの高い優れたプログラムを書くノウハウをまとめています。今回、Pythonのアップデートに合わせて全面改訂。第1版の内容に加えて、データ構造、内包表記とジェネレータ、性能、デバッグについての新たな章を追加し、さらに内容を充実させています。第1版では59項目だったトピックが、第2版では90項目に増えています。Python 3.8対応。
https://www.ohmsha.co.jp/book/9784873119175/
正誤表やDLデータ等がある場合はこちらに掲載しています
推薦の言葉
第2版日本語版へ寄せて
まえがき
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 バグを回避するために静的解析を検討する
訳者あとがき
索引