Fluent Python

―Pythonicな思考とコーディング手法

[cover photo]
TOPICS
Programming , Python
発行年月日
PRINT LENGTH
832
ISBN
978-4-87311-817-8
原書
Fluent Python
FORMAT
Print PDF EPUB
Ebook
6,380円
Ebookを購入する
Print
6,380円

一歩先行くパイソニスタを目指す人のためのPython解説書。Pythonはシンプルです。使い方を覚えるのも簡単で生産性を短期間で高めることができます。しかしこれは、Pythonに備わっている豊富な機能のほんの一部しか使っていないということでもあります。本書では、とても有用なのにあまり使われていないPythonの特徴的な機能を活用し効果的で慣用的なPythonコードを書く方法について解説します。読者は、Pythonicな思考とコーディング手法を身につけ、コードをより短く、より速く、より読みやすくする方法を学べます。本書では、どうすれば熟練のPython 3プログラマーになれるのかを徹底的に追及します。

関連ファイル

目次

賞賛の声
監訳者まえがき
まえがき

第Ⅰ部 プロローグ

1章 Pythonのデータモデル
    1.1 Pythonicなトランプ
    1.2 特殊メソッドの使用方法
         1.2.1 数値型のエミュレーション
         1.2.2 文字列表現
         1.2.3 算術演算子
         1.2.4 カスタム型のブール値
    1.3 特殊メソッドの概要
    1.4 lenがメソッドではない理由
    1.5 本章のまとめ
    1.6 参考文献

第Ⅱ部 データ構造

2章 シーケンスの配列
    2.1 組み込み型シーケンスの概要
    2.2 リスト内包表記とジェネレータ式
         2.2.1 リスト内包表記と可読性
         2.2.2 リスト内包表記とmap/filterの違い
         2.2.3 デカルト積
         2.2.4 ジェネレータ式
    2.3 タプルは単なる不変リストではありません
         2.3.1 レコードとしてのタプル
         2.3.2 タプルのアンパック
         2.3.3 ネストしたタプルのアンパック
         2.3.4 名前付きタプル
         2.3.5 不変リストとしてのタプル
    2.4 スライス
         2.4.1 スライスと範囲指定が最後の要素を含まない理由
         2.4.2 スライスオブジェクト
         2.4.3 スライスへの代入
    2.5 シーケンスの+と*
         2.5.1 リストのリストの生成
    2.6 シーケンスと累算代入
         2.6.1 +=による代入の謎
    2.7 list.sortと組み込み関数sorted
    2.8 bisectを使った順序付きシーケンスの処理
         2.8.1 bisectによるサーチ
         2.8.2 bisect.insortによる挿入
    2.9 listを使わない方がよいケース
         2.9.1 配列
         2.9.2 メモリビュー
         2.9.3 NumPyとSciPy
         2.9.4 デックやその他のキュー
    2.10 本章のまとめ
    2.11 参考文献

3章 ディクショナリとセット
    3.1 一般的なマップ型
    3.2 ディクショナリ内包表記
    3.3 一般的なマップメソッドの概要
         3.3.1 存在しないキーをsetdefaultで処理
    3.4 柔軟なキー検索を使ったマップ
         3.4.1 defaultdict ― 存在しないキーの扱い方その1
         3.4.2 __missing__メソッド ― 存在しないキーの扱い方その2
    3.5 dictのバリエーション
    3.6 UserDictのサブクラス化
    3.7 不変マップ
    3.8 セット
         3.8.1 リテラル
         3.8.2 セット内包表記
         3.8.3 セットの演算
    3.9 dictとsetの内部構造
         3.9.1 性能評価実験
         3.9.2 ディクショナリのハッシュテーブル
         3.9.3 dictの構造に起因する実用上の影響
         3.9.4 セットの挙動
    3.10 本章のまとめ
    3.11 参考文献

4章 テキストとバイト
    4.1 文字の問題
    4.2 バイトについて
         4.2.1 structとメモリビュー
    4.3 基本的なエンコーダとデコーダ
    4.4 エンコードとデコードの問題点
         4.4.1 UnicodeEncodeErrorへの対処策
         4.4.2 UnicodeDecodeErrorへの対処策
         4.4.3 予期しないエンコーディングでモジュールをロードしたときのSyntaxError
         4.4.4 バイトシーケンスのエンコーディングを知る方法
         4.4.5 便利だけど厄介なBOM
    4.5 テキストファイルの処理
         4.5.1 大混乱なデフォルトエンコーディング
    4.6 適切な比較のためのUnicodeの正規化
         4.6.1 ケースフォールディング
         4.6.2 テキストを正規化してから比較するユーティリティ関数
         4.6.3 付加記号を取り除く極端な正規化
    4.7 Unicodeテキストのソート
         4.7.1 Unicode照合アルゴリズムでソート
    4.8 Unicodeデータベース
    4.9 str/bytesデュアルモードAPI
         4.9.1 正規表現におけるstrとbytes
         4.9.2 OSモジュールにおけるstrとbytes
    4.10 本章のまとめ
    4.11 参考文献

第Ⅲ部 オブジェクトとしての関数

5章 第1級関数
    5.1 関数をオブジェクトのように扱う
    5.2 高階関数
         5.2.1 map、filter、reduceの最新の代替
    5.3 無名関数
    5.4 7つの呼び出し可能オブジェクト
    5.5 呼び出し可能なユーザ定義型
    5.6 関数のイントロスペクション
    5.7 位置引数からキーワードオンリー引数へ
    5.8 引数の情報の取得
    5.9 関数アノテーション
    5.10 関数型プログラミングのためのパッケージ
        5.10.1 operatorモジュール
        5.10.2 functools.partialによる引数の固定化
    5.11 本章のまとめ
    5.12 参考文献

6章 第1級関数を使ったデザインパターン
    6.1 リファクタリングのケーススタディとしてのStrategyパターン
         6.1.1 典型的なStrategyパターン
         6.1.2 関数指向のStrategyパターン
         6.1.3 シンプルな方法による最良のstrategyの選択
         6.1.4 モジュールにあるstrategyを検索
    6.2 Commandパターン
    6.3 本章のまとめ
    6.4 参考文献

7章 関数デコレータとクロージャ
    7.1 デコレータの基礎
    7.2 デコレータ実行のタイミング
    7.3 デコレータを使ったStrategyパターンの改善
    7.4 変数スコープ
    7.5 クロージャ
    7.6 nonlocal宣言
    7.7 シンプルなデコレータの実装
         7.7.1 コードの解説
    7.8 標準ライブラリのデコレータ
         7.8.1 functools.lru_cacheを用いたメモ化
         7.8.2 シングルディスパッチのジェネリック関数
    7.9 多重デコレータ
    7.10 パラメータ化デコレータ
        7.10.1 登録デコレータのパラメータ化
        7.10.2 clockデコレータのパラメータ化
    7.11 本章のまとめ
    7.12 参考文献

第Ⅳ部 慣用的なオブジェクト指向

8章 オブジェクト参照、可変性、リサイクル
    8.1 変数≠箱
    8.2 同一性、等価性、エイリアス
         8.2.1 ==とisの使い分け
         8.2.2 タプルの相対的な不変性
    8.3 デフォルトのコピーは「浅い」
         8.3.1 任意のオブジェクトの「深い」コピーと「浅い」コピー
    8.4 参照としての関数の引数
         8.4.1 引数のデフォルト値に可変型を使うのは考えもの
         8.4.2 可変な引数を使うプログラムを頑強に
    8.5 delとガベージコレクション
    8.6 弱参照
         8.6.1 コント「WeakValueDictionary」
         8.6.2 弱参照の制約
    8.7 Pythonが不変型で使っている魔術
    8.8 本章のまとめ
    8.9 参考文献

9章 Pythonicなオブジェクト
    9.1 オブジェクトの表現
    9.2 Vectorクラス再訪
    9.3 別バージョンのコンストラクタ
    9.4 classmethodとstaticmethod
    9.5 出力フォーマット
    9.6 ハッシュ可能なVector2d
    9.7 プライベート属性と「プロテクト」属性
    9.8 クラス属性__slots__によるメモリ節約
         9.8.1 __slots__の問題点
    9.9 クラス属性の上書き
    9.10 本章のまとめ
    9.11 参考文献

10章 シーケンスをばらして、ハッシュして、スライスする
    10.1 ユーザ定義のシーケンス型(Vector)
    10.2 Vector2d互換(Vectorテイク1)
    10.3 プロトコルとダックタイピング
    10.4 スライス可能なシーケンス(Vectorテイク2)
         10.4.1 スライスの仕組み
         10.4.2 スライス対応版の__getitem__
    10.5 動的な属性アクセス(Vectorテイク3)
    10.6 ハッシュとより高速な==(Vectorテイク4)
    10.7 フォーマット(Vectorテイク5)
    10.8 本章のまとめ
    10.9 参考文献

11章 インタフェース ― プロトコルから抽象基底クラスへ
    11.1 Python文化におけるインタフェースとプロトコル
    11.2 とことんまでシーケンスを追いかける
    11.3 プロトコルをランタイムで実装するモンキーパッチ
    11.4 カモ目の分類の話
    11.5 抽象基底クラスのサブクラス化
    11.6 標準ライブラリの抽象基底クラス
         11.6.1 collections.abcの抽象基底クラス
         11.6.2 抽象基底クラスの数の塔
    11.7 抽象基底クラスの定義と利用
         11.7.1 抽象基底クラスの構文
         11.7.2 Tombolaのサブクラス化
         11.7.3 Tombolaの仮想サブクラス
    11.8 Tombolaサブクラスのテスト方法
    11.9 よくあるregisterの使い方
    11.10 ガチョウもアヒルのように振る舞う
    11.11 本章のまとめ
    11.12 参考文献

12章 継承の功罪
    12.1 組み込み型からのサブクラス化には注意が必要
    12.2 多重継承とメソッド解決順序
    12.3 実世界での多重継承
    12.4 多重継承への対処方法
         12.4.1 インタフェースの継承と実装の継承を区別
         12.4.2 インタフェースは抽象基底クラスを使って明示的に
         12.4.3 mixinを使ったコードの再利用
         12.4.4 mixinは名前を使って明示的に
         12.4.5 抽象基底クラスはmixinなこともあるが、その逆はない
         12.4.6 複数の具象クラスからのサブクラス化は不可
         12.4.7 集約クラスの提供
         12.4.8 クラス継承よりもオブジェクトコンポジション
         12.4.9 Tkinter―善玉、悪玉、卑劣なやつ
    12.5 Djangoの汎用ビューにおけるmixin
    12.6 本章のまとめ
    12.7 参考文献

13章 演算子オーバーロードの適切な用法
    13.1 演算子オーバーロードの基礎
    13.2 単項演算子
    13.3 Vectorの加算用「+」をオーバーロード
    13.4 スカラー倍用の「*」をオーバーロード
    13.5 拡張比較演算子
    13.6 累算代入演算子
    13.7 本章のまとめ
    13.8 参考文献

第Ⅴ部 制御フロー

14章 イテラブル、イテレータ、ジェネレータ
    14.1 単語のシーケンス(Sentenceテイク1)
         14.1.1 シーケンスがイテラブルである理由はiter関数にあり
    14.2 イテラブルとイテレータ
    14.3 典型的なイテレータ(Sentenceテイク2)
         14.3.1 Sentenceのイテレータ化はよくないアイデア
    14.4 ジェネレータ関数(Sentenceテイク3)
         14.4.1 ジェネレータ関数の仕組み
    14.5 怠惰な実装(Sentenceテイク4)
    14.6 ジェネレータ式(Sentenceテイク5)
    14.7 いつジェネレータ式を利用すべきか
    14.8 等差数列ジェネレータ
         14.8.1 itertoolsを用いた等差数列
    14.9 標準ライブラリのジェネレータ関数
    14.10 yield from
        14.10.1イテラブルを縮約する関数
        14.10.2関数iterの詳細
        14.10.3ジェネレータを使ったデータベース変換ユーティリティ
        14.10.4コルーチンとしてのジェネレータ
    14.10.5 本章のまとめ
    14.10.6 参考文献

15章 コンテキストマネージャとelseブロック
    15.1 「ああしてからこうする」 ― if以外でのelseブロックの用法
    15.2 コンテキストマネージャとwithブロック
    15.3 contextlibユーティリティ
    15.4 @contextmanager
    15.5 本章のまとめ
    15.6 参考文献

16章 コルーチン
    16.1 ジェネレータの発展形としてのコルーチン
    16.2 コルーチンとしてのジェネレータの基本動作
    16.3 その時点の平均を計算するコルーチン
    16.4 コルーチンの予備処理をするデコレータ
    16.5 コルーチンの終了と例外処理
    16.6 コルーチンから返される値
    16.7 yield from
    16.8 yield fromの意味
    16.9 コルーチンを使った離散事象シミュレーションの事例
         16.9.1 離散事象シミュレーション
         16.9.2 タクシー運行管理シミュレーション
    16.10 本章のまとめ
    16.11 参考文献

17章 futuresを使った並行処理
    17.1 3種類のウェブダウンロードスクリプト
         17.1.1 逐次型ダウンロードスクリプト
         17.1.2 concurrent.futuresを使ったダウンロードスクリプト
         17.1.3 futuresはどこ
    17.2 ブロッキングI/OとGIL
    17.3 concurrent.futuresによるプロセスの起動
    17.4 Executor.mapの実験
    17.5 進行状況表示とエラー処理を加えたダウンロード
         17.5.1 flags2のエラー処理
         17.5.2 futures.as_completedの利用
         17.5.3 threadingあるいはmultiprocessingによる方法
    17.6 本章のまとめ
    17.7 参考文献

18章 asyncioによる並行処理
    18.1 スレッドとコルーチン
         18.1.1 ノンブロッキング型のasyncio.Future
         18.1.2 Future、Task、コルーチンからのyield
    18.2 asyncioおよびaiohttによるダウンロード
    18.3 ブロッキング型の呼び出しをぐるぐるまわす
    18.4 asyncioダウンローダスクリプトの拡張
         18.4.1 asyncio.as_completedの使い方
         18.4.2 Executorを使ったイベントループのブロッキングの回避方法
    18.5 コールバックからFutureとコルーチンへ
         18.5.1 1回のダウンロードにつき複数回のリクエスト
    18.6 asyncioサーバを書く
         18.6.1 asyncio TCPサーバ
         18.6.2 aiohttpウェブサーバ
         18.6.3 並行性を高める賢いクライアント
    18.7 本章のまとめ
    18.8 参考文献

第Ⅵ部 メタプログラミング

19章 動的属性とプロパティ
    19.1 動的属性を用いたデータの変換
         19.1.1 動的属性を用いたJSON風データの取得
         19.1.2 無効な属性名という問題
         19.1.3 __new__を用いた柔軟なオブジェクトの作成
         19.1.4 shelveを用いたOSCONデータの再構成
         19.1.5 プロパティを用いたリンクレコードの取得
    19.2 プロパティを用いた属性の検証
         19.2.1 注文品目のクラス(LineItemテイク1)
         19.2.2 プロパティの検証(LineItemテイク2)
    19.3 プロパティとは何か
         19.3.1 プロパティを用いたインスタンス属性のオーバーライド
         19.3.2 プロパティのドキュメンテーション
    19.4 プロパティファクトリ
    19.5 属性の削除処理
    19.6 属性処理の重要な属性と関数
         19.6.1 属性処理で用いる特殊な属性
         19.6.2 属性処理で用いる組み込み関数
         19.6.3 属性処理で用いる特殊メソッド
    19.7 本章のまとめ
    19.8 参考文献

20章 属性ディスクリプタ
    20.1 属性の検証処理
         20.1.1 単純なディスクリプタ(LineItemテイク3)
         20.1.2 ストレージ属性名を自動的に生成(LineItemテイク4)
         20.1.3 ディスクリプタ型の追加(LineItemテイク5)
    20.2 オーバーライドディスクリプタと非オーバーライドディスクリプタ
         20.2.1 オーバーライドディスクリプタ
         20.2.2 __get__のないオーバーライドディスクリプタ
         20.2.3 非オーバーライドディスクリプタ
         20.2.4 クラスディスクリプタの上書き
    20.3 メソッドはディスクリプタ
    20.4 ディスクリプタの使い方
    20.5 ディスクリプタのdocstringと削除処理のオーバーライド
    20.6 本章のまとめ
    20.7 参考文献

21章 クラスメタプログラミング
    21.1 クラスファクトリ
    21.2 ディスクリプタをカスタマイズするクラスデコレータ
    21.3 インポートタイムとランタイムに起きること
         21.3.1 評価のタイミング
    21.4 メタクラスの基礎
         21.4.1 メタクラスの評価タイミング
    21.5 ディスクリプタをカスタマイズするメタクラス
    21.6 メタクラスの特殊メソッド__prepare__
    21.7 オブジェクトとしてのクラス
    21.8 本章のまとめ
    21.9 参考文献

あとがき

付録A スクリプト
    A.1 in演算子のパフォーマンス評価実験(3.9.1節)
    A.2 ハッシュ値のビットパターン(3.9.2節)
    A.3 __slots__のあるときとないときのRAM使用量(9.8節)
    A.4 データベース変換スクリプト(14.13節)
    A.5 タクシー運行の離散事象シミュレーション(16.9.2節)
    A.6 暗号処理スクリプト(17.3節)
    A.7 HTTPクライアント(17.5節)
    A.8 Unicode文字ファインダ(18.6.1節)
    A.9 OSCONデータ処理スクリプトとテスト用スクリプト(19.1.5節)

付録B 参考文献リンク

付録C 参考文献

用語集
索引