Effective Python 第2版

―Pythonプログラムを改良する90項目

[cover photo]
TOPICS
Programming , Python
発行年月日
PRINT LENGTH
456
ISBN
978-4-87311-917-5
原書
Effective Python: 90 Specific Ways to Write Better Python 2nd Edition
FORMAT
Print PDF EPUB
Ebook
3,960円
Ebookを購入する
Print
3,960円

GoogleでPythonを使ったさまざまなサービスを立ち上げ、Pythonを知り尽くした著者による、Pythonエキスパート必携書の改訂版です。第2版ではPython 3.8に対応、データ構造、内包表記とジェネレータ、性能、デバッグについての章を新たに追加するなど、第1版の59項目を大幅に改訂し、90項目にわたってベストプラクティス、ヒント、落とし穴の避け方だけでなく、新機能の使い方などのノウハウを解説します。優れたPythonコードを書くために何をすべきか、何をすべきでないか、なぜこれが良い方法なのかをPythonの流儀に従って解説。効率的で堅牢であるだけでなく、読みやすく、保守しやすく、改善しやすいPythonicなコードを書く秘訣を教えます。強力な機能を備えながらもシンプルで使いやすく、多くの開発者を惹きつけてやまないPythonの魅力と威力を体感できる一冊です。

正誤表

ここで紹介する正誤表には、書籍発行後に気づいた誤植や更新された情報を掲載しています。以下のリストに記載の年月は、正誤表を作成し、増刷書籍を印刷した月です。お手持ちの書籍では、すでに修正が施されている場合がありますので、書籍最終ページの奥付でお手持ちの書籍の刷版、刷り年月日をご確認の上、ご利用ください。

第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 バグを回避するために静的解析を検討する

訳者あとがき
索引