GoogleでPythonを使ったさまざまなサービスを立ち上げ、Pythonを知り尽くした著者による、Pythonエキスパート必携書の改訂版です。第2版ではPython 3.8に対応、データ構造、内包表記とジェネレータ、性能、デバッグについての章を新たに追加するなど、第1版の59項目を大幅に改訂し、90項目にわたってベストプラクティス、ヒント、落とし穴の避け方だけでなく、新機能の使い方などのノウハウを解説します。優れたPythonコードを書くために何をすべきか、何をすべきでないか、なぜこれが良い方法なのかをPythonの流儀に従って解説。効率的で堅牢であるだけでなく、読みやすく、保守しやすく、改善しやすいPythonicなコードを書く秘訣を教えます。強力な機能を備えながらもシンプルで使いやすく、多くの開発者を惹きつけてやまないPythonの魅力と威力を体感できる一冊です。
Effective Python 第2版
―Pythonプログラムを改良する90項目
Brett Slatkin 著、黒川 利明 訳、石本 敦夫 技術監修
- TOPICS
- Programming , Python
- 発行年月日
- 2020年07月
- PRINT LENGTH
- 456
- ISBN
- 978-4-87311-917-5
- 原書
- Effective Python: 90 Specific Ways to Write Better Python 2nd Edition
- FORMAT
- Print PDF EPUB
正誤表
ここで紹介する正誤表には、書籍発行後に気づいた誤植や更新された情報を掲載しています。以下のリストに記載の年月は、正誤表を作成し、増刷書籍を印刷した月です。お手持ちの書籍では、すでに修正が施されている場合がありますので、書籍最終ページの奥付でお手持ちの書籍の刷版、刷り年月日をご確認の上、ご利用ください。
第1刷正誤表
29ページ、最終行
【誤】
max_letters = count
【正】
max_count = count
33ページ、ページ中央のコードブロック
【誤】
def coprime2(a, b): is_coprime = True for i in range(2, min(a, b) + 1): if a % i == 0 and b % i == 0: is_coprime = False break return is_coprime assert coprime_alternate(4, 9) assert not coprime_alternate(3, 6)
【正】
def coprime_alternate(a, b): is_coprime = True for i in range(2, min(a, b) + 1): if a % i == 0 and b % i == 0: is_coprime = False break return is_coprime assert coprime_alternate(4, 9) assert not coprime_alternate(3, 6)
目次
推薦の言葉 第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 バグを回避するために静的解析を検討する 訳者あとがき 索引