Fluent Python 第2版
Pythonicな思考とコーディング手法
- Luciano Ramalho 著、牧野 聡 訳
- 2025年11月 発行
- 984ページ
- ISBN978-4-8144-0128-4
- フォーマット Print PDF ePub
- 原書: Fluent Python, 2nd Edition
7,700円
書籍のご注文はオーム社サイトへ
内容
ハードコアな読者から圧倒的な支持を受ける定番書籍の改訂版。本書では、Pythonの実務経験がある中・上級の開発者を対象に、Python言語の奥深さと高度な機能を実践的に解説します。本書を通してdoctestによる対話的な例を多用し、単なる知識の紹介にとどまらず、現場での応用力を高めるアプローチを重視しています。タプルのアンパック、デスクリプタ、メタクラスといったPython特有の機能に焦点を当てており、Pythonの能力を隅々まで使いきったコーディングを可能にします。
関連書籍
目次
賞賛の声
まえがき
第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章についての私見