ハードコアな読者から圧倒的な支持を受ける定番書籍の改訂版。本書では、Pythonの実務経験がある中・上級の開発者を対象に、Python言語の奥深さと高度な機能を実践的に解説します。本書を通してdoctestによる対話的な例を多用し、単なる知識の紹介にとどまらず、現場での応用力を高めるアプローチを重視しています。タプルのアンパック、デスクリプタ、メタクラスといったPython特有の機能に焦点を当てており、Pythonの能力を隅々まで使いきったコーディングを可能にします。
Fluent Python 第2版
―Pythonicな思考とコーディング手法
Luciano Ramalho 著、牧野 聡 訳
![[cover photo]](https://www.oreilly.co.jp/books/images/picture_large978-4-8144-0128-4.jpeg)
- TOPICS
- Programming , Python
- 発行年月日
- 2025年11月
- PRINT LENGTH
- 984
- ISBN
- 978-4-8144-0128-4
- 原書
- Fluent Python, 2nd Edition
- FORMAT
関連ファイル
目次
賞賛の声 まえがき 第I部 データ構造 1章 Pythonのデータモデル 1.1 第2版での変更点 1.2 Pythonicなトランプのカード 1.3 特殊メソッドの使い方 1.3.1 数値型のエミュレート 1.3.2 文字列表現 1.3.3 独自型の真偽値表現 1.3.4 コレクションAPI 1.4 特殊メソッドの概要 1.5 lenがメソッドではない理由 1.6 この章のまとめ 1.7 参考資料 2章 さまざまなシーケンス 2.1 第2版での変更点 2.2 組み込みのシーケンス型の概要 2.3 リスト内包記法とジェネレータ表現 2.3.1 リスト内包記法と読みやすさ 2.3.2 listcompとmapやfilterとの比較 2.3.3 デカルト積 2.3.4 ジェネレータ表現 2.4 タプルとイミュータブルなリストの違い 2.4.1 レコードとしてのタプル 2.4.2 イミュータブルなリストとしてのタプル 2.4.3 タプルとリストのメソッド 2.5 シーケンスやイテレート可能なオブジェクトのアンパック 2.5.1 *を使った複数項目の取得 2.5.2 関数呼び出しとシーケンスのリテラルでの*を使ったアンパック 2.5.3 入れ子のアンパック 2.6 シーケンスのパターンマッチング 2.6.1 インタープリタでのシーケンスに対するパターンマッチング 2.7 スライス 2.7.1 スライスやレンジに終点の項目が含まれない理由 2.7.2 スライスのオブジェクト 2.7.3 多次元のスライスと3点リーダー 2.7.4 スライスへの代入 2.8 シーケンスでの+や* 2.8.1 多重のリストの組み立て 2.8.2 シーケンスでの累算代入 2.8.3 +=のクイズ 2.9 list.sortと組み込みのsorted 2.10 リストが最適ではないケース 2.10.1 配列 2.10.2 メモリビュー 2.10.3 NumPy 2.10.4 キュー(デックなど) 2.11 この章のまとめ 2.12 参考資料 3章 ディクショナリとセット 3.1 第2版での変更点 3.2 新しいdictの構文 3.2.1 ディクショナリ内包記法 3.2.2 マッピングのアンパック 3.2.3 |を使ったマッピングのマージ 3.3 マッピングへのパターンマッチング 3.4 マッピング型の標準API 3.4.1 ハッシュ可能とは 3.4.2 マッピングの主なメソッド 3.4.3 ミュータブルな値の挿入と更新 3.5 存在しないキーの自動処理 3.5.1 defaultdict 3.5.2 __missing__メソッド 3.5.3 標準ライブラリでの一貫性に欠ける__missing__の扱い 3.6 dictのバリエーション 3.6.1 collections.OrderedDict 3.6.2 collections.ChainMap 3.6.3 collections.Counter 3.6.4 shelve.Shelf 3.7 (dictではなく)UserDictの継承 3.8 イミュータブルなマッピング 3.9 ディクショナリのビュー 3.10 dictのしくみとその意味 3.11 セットの理論 3.11.1 セットのリテラル 3.11.2 セット内包記法 3.12 実用面でのセットのはたらき 3.12.1 セットの操作 3.13 dictのビューを集合として操作する 3.14 この章のまとめ 3.15 参考資料 4章 Unicode文字列とバイト列 4.1 第2版での変更点 4.2 文字とは 4.3 バイトとは 4.4 エンコーダとデコーダの基礎 4.5 エンコードとデコードでの問題 4.5.1 UnicodeEncodeErrorへの対応 4.5.2 UnicodeDecodeErrorへの対応 4.5.3 予期しないエンコード形式のモジュールによるSyntaxError 4.5.4 バイト列のエンコード形式を知る方法 4.5.5 BOM(有意義な文字化け) 4.6 テキストファイルの処理 4.6.1 デフォルトのエンコード形式 4.7 正規化による、信頼性の高い等価判定 4.7.1 ケースフォールディング 4.7.2 正規化された文字列をマッチングするユーティリティ 4.7.3 極端な「正規化」による発音記号の削除 4.8 Unicode文字列のソート 4.8.1 UCAを使ったソート 4.9 Unicodeデータベース 4.9.1 名前を使った文字の検索 4.9.2 数値としての文字 4.10 strとbytesのデュアルモードAPI 4.10.1 正規表現でのstrとbytes 4.10.2 osモジュールでのstrとbytes 4.11 この章のまとめ 4.12 参考資料 5章 データクラスビルダー 5.1 第2版での変更点 5.2 データクラスビルダーの概要 5.2.1 主な機能 5.3 従来の名前付きタプル 5.4 型付きの名前付きタプル 5.5 型ヒントとは 5.5.1 実行時の効果はない 5.5.2 変数へのアノテーションの構文 5.5.3 変数へのアノテーションの意味 5.6 @dataclassの詳細 5.6.1 フィールドのオプション 5.6.2 初期化後の処理 5.6.3 型付きのクラス属性 5.6.4 フィールドではない初期化用の変数 5.6.5 @dataclassの利用例(Dublin Coreのリソースレコード) 5.7 データクラスとコードスメル 5.7.1 骨格としてのデータクラス 5.7.2 中間表現としてのデータクラス 5.8 クラスのインスタンスへのパターンマッチング 5.8.1 シンプルなクラスパターン 5.8.2 キーワードのクラスパターン 5.8.3 位置のクラスパターン 5.9 この章のまとめ 5.10 参考資料 6章 オブジェクト参照、ミュータブル性、再利用 6.1 第2版での変更点 6.2 変数は箱ではない 6.3 同一性、等価性、エイリアス 6.3.1 ==とisの使い分け 6.3.2 タプルの相対的なイミュータブル性 6.4 デフォルトの浅いコピー 6.4.1 任意のオブジェクトの深いコピーと浅いコピー 6.5 参照としてのパラメータ 6.5.1 ミュータブルなパラメータのデフォルト値(誤った考え) 6.5.2 ミュータブルなパラメータでの防御的プログラミング 6.6 delとガベージコレクション 6.7 Pythonのイミュータブル性に関するトリック 6.8 この章のまとめ 6.9 参考資料 第II部 オブジェクトとしての関数 7章 第1級オブジェクトとしての関数 7.1 第2版での変更点 7.2 関数をオブジェクトとして扱うこと 7.3 高階関数 7.3.1 map、filter、reduceに代わる新しいやり方 7.4 匿名関数 7.5 9種の呼び出し可能なオブジェクト 7.6 ユーザー定義の呼び出し可能な型 7.7 位置専用引数からキーワード専用引数へ 7.7.1 位置専用パラメータ 7.8 関数型プログラミングのためのパッケージ 7.8.1 operatorモジュール 7.8.2 functools.partialを使った引数の固定 7.9 この章のまとめ 7.10 参考資料 8章 関数での型ヒント 8.1 第2版での変更点 8.2 漸進的型付けとは 8.3 漸進的型付けの実践 8.3.1 手始めのMypy 8.3.2 Mypyのチェックを厳しくする 8.3.3 パラメータのデフォルト値 8.3.4 デフォルトのNone 8.4 実行可能な操作が型を決める 8.5 アノテーションで利用できる型 8.5.1 Any型 8.5.2 シンプルな型とクラス 8.5.3 Optional型とUnion型 8.5.4 ジェネリックなコレクション 8.5.5 タプル型 8.5.6 ジェネリックなマッピング 8.5.7 抽象基底クラス 8.5.8 Iterable 8.5.9 パラメータ化されたジェネリック型とTypeVar 8.5.10 静的プロトコル 8.5.11 呼び出し可能なオブジェクト 8.5.12 NoReturn 8.6 位置専用パラメータと可変長パラメータへのアノテーション 8.7 不完全な型付けと、テストの重要性 8.8 この章のまとめ 8.9 参考資料 9章 デコレータとクロージャ 9.1 第2版での変更点 9.2 デコレータ入門 9.3 デコレータが実行されるタイミング 9.4 登録のデコレータ 9.5 変数のスコープのルール 9.6 クロージャ 9.7 非ローカル宣言 9.7.1 変数を探索するロジック 9.8 シンプルなデコレータの実装 9.8.1 デコレータのしくみ 9.9 標準ライブラリのデコレータ 9.9.1 functools.cacheを使ったメモ化 9.9.2 lru_cacheの利用 9.9.3 シングルディスパッチのジェネリック関数 9.10 パラメータ付きのデコレータ 9.10.1 パラメータ付きの登録のデコレータ 9.10.2 パラメータ付きの計測のデコレータ 9.10.3 クラスベースの計測のデコレータ 9.11 この章のまとめ 9.12 参考資料 10章 第1級関数のデザインパターン 10.1 第2版での変更点 10.2 Strategyパターンのリファクタリング(ケーススタディ) 10.2.1 従来のStrategy 10.2.2 関数指向のStrategy 10.2.3 最善のストラテジーの選択(シンプルなアプローチ) 10.2.4 モジュール内にあるストラテジーの探索 10.3 デコレータによるStrategyパターンの強化 10.4 Commandパターン 10.5 この章のまとめ 10.6 参考資料 第III部 クラスとプロトコル 11章 Pythonicなオブジェクト 11.1 第2版での変更点 11.2 オブジェクトの表現 11.3 ベクトルのクラスふたたび 11.4 もう1つのコンストラクタ 11.5 classmethodとstaticmethod 11.6 整形された出力 11.7 ハッシュ可能なVector2d 11.8 位置引数とのマッチング 11.9 Vector2dバージョン3の全文 11.10 private属性と「protected」属性 11.11 __slots__によるメモリ使用量の削減 11.11.1 __slot__の効果測定 11.11.2 __slots__での注意点 11.12 クラス属性の上書き 11.13 この章のまとめ 11.14 参考資料 12章 シーケンスの特殊メソッド 12.1 第2版での変更点 12.2 Vector(ユーザー定義のシーケンス型) 12.3 Vectorバージョン1(Vector2dとの互換性) 12.4 プロトコルとダックタイピング 12.5 Vectorバージョン2(スライス可能なシーケンス) 12.5.1 スライスのしくみ 12.5.2 スライスに対応した__getitem__ 12.6 Vectorバージョン3(属性への動的アクセス) 12.7 Vectorバージョン4(ハッシュと高速な==の計算) 12.8 Vectorバージョン5(書式付き出力) 12.9 この章のまとめ 12.10 参考資料 13章 インターフェース、プロトコル、ABC 13.1 型マップ 13.2 第2版での変更点 13.3 2種類のプロトコル 13.4 ダックタイピングのプログラム 13.4.1 シーケンスの取り扱い 13.4.2 モンキーパッチ(実行時のプロトコル定義) 13.4.3 防衛的プログラミングとフェイルファスト 13.5 グースタイピング 13.5.1 ABCの子クラス(その1) 13.5.2 標準ライブラリのABC 13.5.3 ABCの定義と利用 13.5.4 ABCの構文の詳細 13.5.5 ABCの子クラス(その2) 13.5.6 ABCの仮想子クラス 13.5.7 登録の実際 13.5.8 ABCを使った構造的型付け 13.6 静的プロトコル 13.6.1 型付きのdouble関数 13.6.2 静的プロトコルを使った実行時のチェック 13.6.3 実行時のプロトコルの限界 13.6.4 静的プロトコルのサポート 13.6.5 静的プロトコルの設計 13.6.6 プロトコル設計のベストプラクティス 13.6.7 プロトコルの拡張 13.6.8 数値のABCと数値のプロトコル 13.7 この章のまとめ 13.8 参考資料 14章 継承の光と影 14.1 第2版での変更点 14.2 super()関数 14.3 組み込み型の子クラスにまつわる問題 14.4 多重継承とMRO 14.5 ミックスインのクラス 14.5.1 大文字と小文字を区別しないマップ 14.6 実世界での多重継承 14.6.1 ABCもミックスインである 14.6.2 ThreadingMixInとForkingMixIn 14.6.3 Djangoでのジェネリックビューのミックスイン 14.6.4 Tkinterでの多重継承 14.7 継承への対応 14.7.1 クラスの継承よりも、オブジェクトのコンポジション 14.7.2 各ケースで継承が必要な理由を理解する 14.7.3 ABCを使ってインターフェースを明確化する 14.7.4 コードの再利用にはミックスイン専用のクラスを使う 14.7.5 集約クラスを提供する 14.7.6 継承を前提としたクラスだけを継承する 14.7.7 具象クラスを継承しない 14.7.8 Tkinterの利点と欠点と醜い点 14.8 この章のまとめ 14.9 参考資料 15章 型ヒントの詳細 15.1 第2版での変更点 15.2 オーバーロードされたシグネチャ 15.2.1 maxのオーバーロード 15.2.2 maxのオーバーロードからわかること 15.3 TypedDict 15.4 型のキャスト 15.5 実行時の型ヒントの取得 15.5.1 実行時のアノテーションの問題点 15.5.2 問題点への対策 15.6 ジェネリックなクラスの実装 15.6.1 ジェネリックな型の用語集 15.7 変性 15.7.1 非変のディスペンサー 15.7.2 共変のディスペンサー 15.7.3 反変のゴミ箱 15.7.4 変性のまとめ 15.8 ジェネリックな静的プロトコルの実装 15.9 この章のまとめ 15.10 参考資料 16章 演算子のオーバーロード 16.1 第2版での変更点 16.2 演算子のオーバーロードとは 16.3 単項演算子 16.4 +のオーバーロードによるベクトルの加算 16.5 *のオーバーロードによるスカラー倍の計算 16.6 中置演算子としての@ 16.7 算術演算子のまとめ 16.8 拡張比較の演算子 16.9 累算代入の演算子 16.10 この章のまとめ 16.11 参考資料 第IV部 制御フロー 17章 イテレータ、ジェネレータ、従来のコルーチン 17.1 第2版での変更点 17.2 単語のシーケンス 17.3 シーケンスをイテレート可能にするiter関数 17.3.1 呼び出し可能なオブジェクトと組み合わせたiter 17.4 イテレート可能なオブジェクトとイテレータ 17.5 __iter__を実装したクラス 17.5.1 Sentenceクラス、テイク2(従来のイテレータ) 17.5.2 イテレート可能なオブジェクトを自身のイテレータにしない 17.5.3 Sentenceクラス、テイク3(ジェネレータ関数) 17.5.4 ジェネレータのしくみ 17.6 遅延評価のSentence 17.6.1 Sentenceクラス、テイク4(遅延評価のジェネレータ) 17.6.2 Sentenceクラス、テイク5(遅延評価のジェネレータ表現) 17.7 ジェネレータ表現の使いどき 17.8 等差数列のジェネレータ 17.8.1 itertoolsを使った等差数列 17.9 標準ライブラリのジェネレータ関数 17.10 イテレート可能なオブジェクトに対する集約の関数 17.11 yield fromとサブジェネレータ 17.11.1 chainの再実装 17.11.2 木構造の探索 17.12 ジェネリックなイテレート可能な型 17.13 従来のコルーチン 17.13.1 平均を計算するコルーチンの例 17.13.2 コルーチンからの戻り値 17.13.3 従来のコルーチンへのジェネリックな型ヒント 17.14 この章のまとめ 17.15 参考資料 18章 with、match、elseのブロック 18.1 第2版での変更点 18.2 コンテキストマネージャとwithブロック 18.2.1 contextlibユーティリティ 18.2.2 @contextmanagerの利用 18.3 lis.pyでのパターンマッチング(ケーススタディ) 18.3.1 Schemeの構文 18.3.2 インポートと型宣言 18.3.3 構文解析 18.3.4 環境 18.3.5 REPL 18.3.6 式の評価 18.3.7 Procedure(クロージャを実装したクラス) 18.3.8 ORパターン 18.4 if以外でのelse(Aの後でBを行う) 18.5 この章のまとめ 18.6 参考資料 19章 Pythonの並行処理モデル 19.1 第2版での変更点 19.2 全体像 19.3 用語の確認 19.3.1 プロセス、スレッド、悪名高いGIL 19.4 並行型Hello World 19.4.1 スレッドを使ったスピナー 19.4.2 プロセスを使ったスピナー 19.4.3 コルーチンを使ったスピナー 19.4.4 スーパーバイザの比較 19.5 GILの実質的な影響 19.5.1 ここでクイズ 19.6 ネイティブなプロセスプール 19.6.1 プロセスベースの実装 19.6.2 所要時間 19.6.3 マルチコア向けの素数チェッカー 19.6.4 プロセス数を増減させる実験 19.6.5 スレッドベースの不本意な実装 19.7 マルチコアとPython 19.7.1 システム管理 19.7.2 データサイエンス 19.7.3 サーバーサイドのWeb・モバイル開発 19.7.4 WSGIのアプリケーションサーバー 19.7.5 分散タスクキュー 19.8 この章のまとめ 19.9 参考資料 19.9.1 スレッドやプロセスを使った並行性 19.9.2 GIL 19.9.3 標準ライブラリ以外での並行性 19.9.4 Python以外での並行性とスケーラビリティ 20章 並行処理のExecutor 20.1 第2版での変更点 20.2 Webからの並行ダウンロード 20.2.1 逐次ダウンロードのスクリプト 20.2.2 concurrent.futuresによるダウンロード 20.2.3 futureの使われ方 20.3 concurrent.futuresを使ったプロセスの起動 20.3.1 マルチコアの素数判定ふたたび 20.4 Executor.mapを使った実験 20.5 進捗の表示とエラー処理 20.5.1 flags2でのエラー処理 20.5.2 futures.as_completedの使い方 20.6 この章のまとめ 20.7 参考資料 21章 非同期プログラミング 21.1 第2版での変更点 21.2 用語の定義 21.3 asyncioの利用例(ドメイン名の検索) 21.3.1 非同期処理のコードを読むための、Guidoによるヒント 21.4 待機可能なオブジェクト(新しい概念) 21.5 asyncioとHTTPXを使ったダウンロード 21.5.1 目立たないジェネレータ(ネイティブなコルーチンの秘密) 21.5.2 すべてか無か 21.6 非同期のコンテキストマネージャ 21.7 asyncio版ダウンローダの拡張 21.7.1 asyncio.as_completedとスレッド 21.7.2 セマフォを使ったリクエストの流量制限 21.7.3 1国ごとに複数回のリクエストを行う 21.8 Executorへのタスクの委譲 21.9 asyncioのサーバー 21.9.1 FastAPIのWebサービス 21.9.2 asyncioのTCPサーバー 21.10 非同期のイテレート可能なオブジェクト 21.10.1 非同期のジェネレータ関数 21.10.2 非同期の内包記法と非同期のジェネレータ関数 21.11 Curio(asyncio以上のasync) 21.12 非同期のオブジェクトへの型ヒント 21.13 非同期プログラミングでできることとできないこと 21.13.1 ブロックを伴う呼び出しはいつまでも終わらない 21.13.2 入出力主体のシステムという誤解 21.13.3 CPUの多用による落とし穴 21.14 この章のまとめ 21.15 参考資料 第V部 メタプログラミング 22章 動的属性とプロパティ 22.1 第2版での変更点 22.2 動的属性を使ったデータ処理 22.2.1 JSON状のデータと動的属性 22.2.2 不正な属性名の問題 22.2.3 __new__を使った柔軟なオブジェクトの生成 22.3 算出されるプロパティ 22.3.1 ステップ1(データ駆動型の属性の生成) 22.3.2 ステップ2(リンク先のレコードを取得するためのプロパティ) 22.3.3 ステップ3(既存の属性を上書きするプロパティ) 22.3.4 ステップ4(自作のプロパティキャッシュ) 22.3.5 ステップ5(functoolsを使ったプロパティのキャッシュ) 22.4 属性値を検証するためのプロパティ 22.4.1 LineItemテイク1(注文品目のクラス) 22.4.2 LineItemテイク2(プロパティの検証) 22.5 プロパティの正しい理解 22.5.1 プロパティによるインスタンス属性の上書き 22.5.2 プロパティのドキュメント 22.6 プロパティのファクトリの実装 22.7 属性の削除 22.8 属性を管理する属性と関数 22.8.1 属性の扱いに影響する特殊属性 22.8.2 属性を管理する組み込み関数 22.8.3 属性を管理する特殊メソッド 22.9 この章のまとめ 22.10 参考資料 23章 属性のデスクリプタ 23.1 第2版での変更点 23.2 デスクリプタの例(属性値の検証) 23.2.1 LineItemテイク3(シンプルなデスクリプタ) 23.2.2 LineItemテイク4(格納先の属性の自動的な名付け) 23.2.3 LineItemテイク5(新しいデスクリプタの型) 23.3 オーバーライド型と非オーバーライド型のデスクリプタ 23.3.1 オーバーライド型デスクリプタ 23.3.2 __get__のないオーバーライド型デスクリプタ 23.3.3 非オーバーライド型デスクリプタ 23.3.4 クラスでのデスクリプタの上書き 23.4 デスクリプタとしてのメソッド 23.5 デスクリプタの活用ヒント 23.6 デスクリプタのdocstringと削除のオーバーライド 23.7 この章のまとめ 23.8 参考資料 24章 クラスのメタプログラミング 24.1 第2版での変更点 24.2 オブジェクトとしてのクラス 24.3 type(組み込み型のファクトリ) 24.4 クラスのファクトリ関数 24.5 __init_subclass__とは 24.5.1 __init_subclass__が__slots__の設定を行えない理由 24.6 デコレータを通じたクラスの拡張 24.7 インポート時と実行時に行われる処理 24.7.1 評価されるタイミング 24.8 メタクラスとは 24.8.1 メタクラスによるクラスのカスタマイズ 24.8.2 実用的なメタクラスの例 24.8.3 メタクラスが評価されるタイミング 24.9 メタクラスによる型チェック 24.10 実世界でのメタクラス 24.10.1 メタクラスよりもシンプルな機能や置き換え可能な機能 24.10.2 安定した言語機能としてのメタクラス 24.10.3 指定できるメタクラスは1つだけ 24.10.4 メタクラスは単なる実装の詳細 24.11 __prepare__を使ったメタクラスのハック 24.12 結局のところ、メタクラスとは 24.13 この章のまとめ 24.14 参考資料 あとがき 参考資料 索引 コラム目次 1章についての私見 リスト内包記法やジェネレータ表現でのスコープ 2章についての私見 3章についての私見 UTF-8を仮定してデコードするLeonardoのハック 4章についての私見 namedtupleにメソッドをインジェクトするハック コードスメル 5章についての私見 6章についての私見 Fredrik Lundhのラムダ式のリファクタリング 7章についての私見 flake8やblueを使ったスタイルチェック レガシーコードへの対応と、非推奨のコレクション型 8章についての私見 バイトコードの比較 9章についての私見 10章についての私見 11章についての私見 3次元を超えるベクトルの利用例 zipのすばらしさ 12章についての私見 水鳥とABC HashableとIterableに対するisinstanceでの誤解 ダックタイピングは友達 13章についての私見 14章についての私見 15章についての私見 xと+xが等しくない場合 16章についての私見 イテレータとジェネレータの比較 17章についての私見 プログラミング言語に予約語が必要な理由 PythonのnonlocalとSchemeのset!が解決する問題 18章についての私見 greenletとgevent sleep(0)による仮眠状態 ループ、sentinel値、ポイズンピル 19章についての私見 20章についての私見 Pythonでのセマフォ 転置インデックス 21章についての私見 22章についての私見 工場とロボットの記法 23章についての私見 __init_subclass__と一般的なクラスメソッドの違い 架空のシナリオ 24章についての私見