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

Book description

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

Table of contents

  1.  大扉
  2.  原書大扉
  3.  クレジット
  4.  献辞
  5.  賞賛の声
  6.  監訳者まえがき
  7.  まえがき
  8.   対象となる読者
  9.   対象としていない読者
  10.   本書の構成
  11.   実践的なアプローチ
  12.   性能評価に使用したハードウェア
  13.   Soapbox(個人的な議論)
  14.   用語集
  15.   対象とするPythonのバージョン
  16.   表記上のルール
  17.   サンプルコードの使用について
  18.   意見と質問
  19.   謝辞
  20. 第I部 プロローグ
  21.  1章 Pythonのデータモデル
  22.   1.1 Pythonicなトランプ
  23.   1.2 特殊メソッドの使用方法
  24.    1.2.1 数値型のエミュレーション
  25.    1.2.2 文字列表現
  26.    1.2.3 算術演算子
  27.    1.2.4 カスタム型のブール値
  28.   1.3 特殊メソッドの概要
  29.   1.4 lenがメソッドではない理由
  30.   1.5 本章のまとめ
  31.   1.6 参考文献
  32. 第II部 データ構造
  33.  2章 シーケンスの配列
  34.   2.1 組み込み型シーケンスの概要
  35.   2.2 リスト内包表記とジェネレータ式
  36.    2.2.1 リスト内包表記と可読性
  37.    2.2.2 リスト内包表記とmap/filterの違い
  38.    2.2.3 デカルト積
  39.    2.2.4 ジェネレータ式
  40.   2.3 タプルは単なる不変リストではありません
  41.    2.3.1 レコードとしてのタプル
  42.    2.3.2 タプルのアンパック
  43.    2.3.3 ネストしたタプルのアンパック
  44.    2.3.4 名前付きタプル
  45.    2.3.5 不変リストとしてのタプル
  46.   2.4 スライス
  47.    2.4.1 スライスと範囲指定が最後の要素を含まない理由
  48.    2.4.2 スライスオブジェクト
  49.    2.4.3 スライスへの代入
  50.   2.5 シーケンスの+と*
  51.    2.5.1 リストのリストの生成
  52.   2.6 シーケンスと累算代入
  53.    2.6.1 +=による代入の謎
  54.   2.7 list.sortと組み込み関数sorted
  55.   2.8 bisectを使った順序付きシーケンスの処理
  56.    2.8.1 bisectによるサーチ
  57.    2.8.2 bisect.insortによる挿入
  58.   2.9 listを使わない方がよいケース
  59.    2.9.1 配列
  60.    2.9.2 メモリビュー
  61.    2.9.3 NumPyとSciPy
  62.    2.9.4 デックやその他のキュー
  63.   2.10 本章のまとめ
  64.   2.11 参考文献
  65.  3章 ディクショナリとセット
  66.   3.1 一般的なマップ型
  67.   3.2 ディクショナリ内包表記
  68.   3.3 一般的なマップメソッドの概要
  69.    3.3.1 存在しないキーをsetdefaultで処理
  70.   3.4 柔軟なキー検索を使ったマップ
  71.    3.4.1 defaultdict——存在しないキーの扱い方 その1
  72.    3.4.2 __missing__メソッド——存在しないキーの扱い方 その2
  73.   3.5 dictのバリエーション
  74.   3.6 UserDictのサブクラス化
  75.   3.7 不変マップ
  76.   3.8 セット
  77.    3.8.1 リテラル
  78.    3.8.2 セット内包表記
  79.    3.8.3 セットの演算
  80.   3.9 dictとsetの内部構造
  81.    3.9.1 性能評価実験
  82.    3.9.2 ディクショナリのハッシュテーブル
  83.    3.9.3 dictの構造に起因する実用上の影響
  84.    3.9.4 セットの挙動
  85.   3.10 本章のまとめ
  86.   3.11 参考文献
  87.  4章 テキストとバイト
  88.   4.1 文字の問題
  89.   4.2 バイトについて
  90.    4.2.1 structとメモリビュー
  91.   4.3 基本的なエンコーダとデコーダ
  92.   4.4 エンコードとデコードの問題点
  93.    4.4.1 UnicodeEncodeErrorへの対処策
  94.    4.4.2 UnicodeDecodeErrorへの対処策
  95.    4.4.3 予期しないエンコーディングでモジュールをロードしたときのSyntaxError
  96.    4.4.4 バイトシーケンスのエンコーディングを知る方法
  97.    4.4.5 便利だけど厄介なBOM
  98.   4.5 テキストファイルの処理
  99.    4.5.1 大混乱なデフォルトエンコーディング
  100.   4.6 適切な比較のためのUnicodeの正規化
  101.    4.6.1 ケースフォールディング
  102.    4.6.2 テキストを正規化してから比較するユーティリティ関数
  103.    4.6.3 付加記号を取り除く極端な正規化
  104.   4.7 Unicodeテキストのソート
  105.    4.7.1 Unicode照合アルゴリズムでソート
  106.   4.8 Unicodeデータベース
  107.   4.9 str/bytesデュアルモードAPI
  108.    4.9.1 正規表現におけるstrとbytes
  109.    4.9.2 OSモジュールにおけるstrとbytes
  110.   4.10 本章のまとめ
  111.   4.11 参考文献
  112. 第III部 オブジェクトとしての関数
  113.  5章 第1級関数
  114.   5.1 関数をオブジェクトのように扱う
  115.   5.2 高階関数
  116.    5.2.1 map、filter、reduceの最新の代替
  117.   5.3 無名関数
  118.   5.4 7つの呼び出し可能オブジェクト
  119.   5.5 呼び出し可能なユーザ定義型
  120.   5.6 関数のイントロスペクション
  121.   5.7 位置引数からキーワードオンリー引数へ
  122.   5.8 引数の情報の取得
  123.   5.9 関数アノテーション
  124.   5.10 関数型プログラミングのためのパッケージ
  125.    5.10.1 operatorモジュール
  126.    5.10.2 functools.partialによる引数の固定化
  127.   5.11 本章のまとめ
  128.   5.12 参考文献
  129.  6章 第1級関数を使ったデザインパターン
  130.   6.1 リファクタリングのケーススタディとしてのStrategyパターン
  131.    6.1.1 典型的なStrategyパターン
  132.    6.1.2 関数指向のStrategyパターン
  133.    6.1.3 シンプルな方法による最良のstrategyの選択
  134.    6.1.4 モジュールにあるstrategyを検索
  135.   6.2 Commandパターン
  136.   6.3 本章のまとめ
  137.   6.4 参考文献
  138.  7章 関数デコレータとクロージャ
  139.   7.1 デコレータの基礎
  140.   7.2 デコレータ実行のタイミング
  141.   7.3 デコレータを使ったStrategyパターンの改善
  142.   7.4 変数スコープ
  143.   7.5 クロージャ
  144.   7.6 nonlocal宣言
  145.   7.7 シンプルなデコレータの実装
  146.    7.7.1 コードの解説
  147.   7.8 標準ライブラリのデコレータ
  148.    7.8.1 functools.lru_cacheを用いたメモ化
  149.    7.8.2 シングルディスパッチのジェネリック関数
  150.   7.9 多重デコレータ
  151.   7.10 パラメータ化デコレータ
  152.    7.10.1 登録デコレータのパラメータ化
  153.    7.10.2 clockデコレータのパラメータ化
  154.   7.11 本章のまとめ
  155.   7.12 参考文献
  156. 第IV部 慣用的なオブジェクト指向
  157.  8章 オブジェクト参照、可変性、リサイクル
  158.   8.1 変数≠箱
  159.   8.2 同一性、等価性、エイリアス
  160.    8.2.1 ==とisの使い分け
  161.    8.2.2 タプルの相対的な不変性
  162.   8.3 デフォルトのコピーは「浅い」
  163.    8.3.1 任意のオブジェクトの「深い」コピーと「浅い」コピー
  164.   8.4 参照としての関数の引数
  165.    8.4.1 引数のデフォルト値に可変型を使うのは考えもの
  166.    8.4.2 可変な引数を使うプログラムを頑強に
  167.   8.5 delとガベージコレクション
  168.   8.6 弱参照
  169.    8.6.1 コント「WeakValueDictionary」
  170.    8.6.2 弱参照の制約
  171.   8.7 Pythonが不変型で使っている魔術
  172.   8.8 本章のまとめ
  173.   8.9 参考文献
  174.  9章 Pythonicなオブジェクト
  175.   9.1 オブジェクトの表現
  176.   9.2 Vectorクラス再訪
  177.   9.3 別バージョンのコンストラクタ
  178.   9.4 classmethodとstaticmethod
  179.   9.5 出力フォーマット
  180.   9.6 ハッシュ可能なVector2d
  181.   9.7 プライベート属性と「プロテクト」属性
  182.   9.8 クラス属性__slots__によるメモリ節約
  183.    9.8.1 __slots__の問題点
  184.   9.9 クラス属性の上書き
  185.   9.10 本章のまとめ
  186.   9.11 参考文献
  187.  10章 シーケンスをばらして、ハッシュして、スライスする
  188.   10.1 ユーザ定義のシーケンス型(Vector)
  189.   10.2 Vector2d互換(Vectorテイク1)
  190.   10.3 プロトコルとダックタイピング
  191.   10.4 スライス可能なシーケンス(Vectorテイク2)
  192.    10.4.1 スライスの仕組み
  193.    10.4.2 スライス対応版の__getitem__
  194.   10.5 動的な属性アクセス(Vectorテイク3)
  195.   10.6 ハッシュとより高速な==(Vectorテイク4)
  196.   10.7 フォーマット(Vectorテイク5)
  197.   10.8 本章のまとめ
  198.   10.9 参考文献
  199.  11章 インタフェース——プロトコルから抽象基底クラスへ
  200.   11.1 Python文化におけるインタフェースとプロトコル
  201.   11.2 とことんまでシーケンスを追いかける
  202.   11.3 プロトコルをランタイムで実装するモンキーパッチ
  203.   11.4 カモ目の分類の話
  204.   11.5 抽象基底クラスのサブクラス化
  205.   11.6 標準ライブラリの抽象基底クラス
  206.    11.6.1 collections.abcの抽象基底クラス
  207.    11.6.2 抽象基底クラスの数の塔
  208.   11.7 抽象基底クラスの定義と利用
  209.    11.7.1 抽象基底クラスの構文
  210.    11.7.2 Tombolaのサブクラス化
  211.    11.7.3 Tombolaの仮想サブクラス
  212.   11.8 Tombolaサブクラスのテスト方法
  213.   11.9 よくあるregisterの使い方
  214.   11.10 ガチョウもアヒルのように振る舞う
  215.   11.11 本章のまとめ
  216.   11.12 参考文献
  217.  12章 継承の功罪
  218.   12.1 組み込み型からのサブクラス化には注意が必要
  219.   12.2 多重継承とメソッド解決順序
  220.   12.3 実世界での多重継承
  221.   12.4 多重継承への対処方法
  222.    12.4.1 インタフェースの継承と実装の継承を区別
  223.    12.4.2 インタフェースは抽象基底クラスを使って明示的に
  224.    12.4.3 mixinを使ったコードの再利用
  225.    12.4.4 mixinは名前を使って明示的に
  226.    12.4.5 抽象基底クラスはmixinなこともあるが、その逆はない
  227.    12.4.6 複数の具象クラスからのサブクラス化は不可
  228.    12.4.7 集約クラスの提供
  229.    12.4.8 クラス継承よりもオブジェクトコンポジション
  230.    12.4.9 Tkinter——善玉、悪玉、卑劣なやつ
  231.   12.5 Djangoの汎用ビューにおけるmixin
  232.   12.6 本章のまとめ
  233.   12.7 参考文献
  234.  13章 演算子オーバーロードの適切な用法
  235.   13.1 演算子オーバーロードの基礎
  236.   13.2 単項演算子
  237.   13.3 Vectorの加算用「+」をオーバーロード
  238.   13.4 スカラー倍用の「*」をオーバーロード
  239.   13.5 拡張比較演算子
  240.   13.6 累算代入演算子
  241.   13.7 本章のまとめ
  242.   13.8 参考文献
  243. 第V部 制御フロー
  244.  14章 イテラブル、イテレータ、ジェネレータ
  245.   14.1 単語のシーケンス(Sentenceテイク1)
  246.    14.1.1 シーケンスがイテラブルである理由はiter関数にあり
  247.   14.2 イテラブルとイテレータ
  248.   14.3 典型的なイテレータ(Sentenceテイク2)
  249.    14.3.1 Sentenceのイテレータ化はよくないアイデア
  250.   14.4 ジェネレータ関数(Sentenceテイク3)
  251.    14.4.1 ジェネレータ関数の仕組み
  252.   14.5 怠惰な実装(Sentenceテイク4)
  253.   14.6 ジェネレータ式(Sentenceテイク5)
  254.   14.7 いつジェネレータ式を利用すべきか
  255.   14.8 等差数列ジェネレータ
  256.    14.8.1 itertoolsを用いた等差数列
  257.   14.9 標準ライブラリのジェネレータ関数
  258.   14.10 yield from
  259.   14.11 イテラブルを縮約する関数
  260.   14.12 関数iterの詳細
  261.   14.13 ジェネレータを使ったデータベース変換ユーティリティ
  262.   14.14 コルーチンとしてのジェネレータ
  263.   14.15 本章のまとめ
  264.   14.16 参考文献
  265.  15章 コンテキストマネージャとelseブロック
  266.   15.1 「ああしてからこうする」——if以外でのelseブロックの用法
  267.   15.2 コンテキストマネージャとwithブロック
  268.   15.3 contextlibユーティリティ
  269.   15.4 @contextmanager
  270.   15.5 本章のまとめ
  271.   15.6 参考文献
  272.  16章 コルーチン
  273.   16.1 ジェネレータの発展形としてのコルーチン
  274.   16.2 コルーチンとしてのジェネレータの基本動作
  275.   16.3 その時点の平均を計算するコルーチン
  276.   16.4 コルーチンの予備処理をするデコレータ
  277.   16.5 コルーチンの終了と例外処理
  278.   16.6 コルーチンから返される値
  279.   16.7 yield from
  280.   16.8 yield fromの意味
  281.   16.9 コルーチンを使った離散事象シミュレーションの事例
  282.    16.9.1 離散事象シミュレーション
  283.    16.9.2 タクシー運行管理シミュレーション
  284.   16.10 本章のまとめ
  285.   16.11 参考文献
  286.  17章 futuresを使った並行処理
  287.   17.1 3種類のウェブダウンロードスクリプト
  288.    17.1.1 逐次型ダウンロードスクリプト
  289.    17.1.2 concurrent.futuresを使ったダウンロードスクリプト
  290.    17.1.3 futuresはどこ
  291.   17.2 ブロッキングI/OとGIL
  292.   17.3 concurrent.futuresによるプロセスの起動
  293.   17.4 Executor.mapの実験
  294.   17.5 進行状況表示とエラー処理を加えたダウンロード
  295.    17.5.1 flags2のエラー処理
  296.    17.5.2 futures.as_completedの利用
  297.    17.5.3 threadingあるいはmultiprocessingによる方法
  298.   17.6 本章のまとめ
  299.   17.7 参考文献
  300.  18章 asyncioによる並行処理
  301.   18.1 スレッドとコルーチン
  302.    18.1.1 ノンブロッキング型のasyncio.Future
  303.    18.1.2 Future、Task、コルーチンからのyield
  304.   18.2 asyncioおよびaiohttpによるダウンロード
  305.   18.3 ブロッキング型の呼び出しをぐるぐるまわす
  306.   18.4 asyncioダウンローダスクリプトの拡張
  307.    18.4.1 asyncio.as_completedの使い方
  308.    18.4.2 Executorを使ったイベントループのブロッキングの回避方法
  309.   18.5 コールバックからFutureとコルーチンへ
  310.    18.5.1 1回のダウンロードにつき複数回のリクエスト
  311.   18.6 asyncioサーバを書く
  312.    18.6.1 asyncio TCPサーバ
  313.    18.6.2 aiohttpウェブサーバ
  314.    18.6.3 並行性を高める賢いクライアント
  315.   18.7 本章のまとめ
  316.   18.8 参考文献
  317. 第VI部 メタプログラミング
  318.  19章 動的属性とプロパティ
  319.   19.1 動的属性を用いたデータの変換
  320.    19.1.1 動的属性を用いたJSON風データの取得
  321.    19.1.2 無効な属性名という問題
  322.    19.1.3 __new__を用いた柔軟なオブジェクトの作成
  323.    19.1.4 shelveを用いたOSCONデータの再構成
  324.    19.1.5 プロパティを用いたリンクレコードの取得
  325.   19.2 プロパティを用いた属性の検証
  326.    19.2.1 注文品目のクラス(LineItemテイク1)
  327.    19.2.2 プロパティの検証(LineItemテイク2)
  328.   19.3 プロパティとは何か
  329.    19.3.1 プロパティを用いたインスタンス属性のオーバーライド
  330.    19.3.2 プロパティのドキュメンテーション
  331.   19.4 プロパティファクトリ
  332.   19.5 属性の削除処理
  333.   19.6 属性処理の重要な属性と関数
  334.    19.6.1 属性処理で用いる特殊な属性
  335.    19.6.2 属性処理で用いる組み込み関数
  336.    19.6.3 属性処理で用いる特殊メソッド
  337.   19.7 本章のまとめ
  338.   19.8 参考文献
  339.  20章 属性ディスクリプタ
  340.   20.1 属性の検証処理
  341.    20.1.1 単純なディスクリプタ(LineItemテイク3)
  342.    20.1.2 ストレージ属性名を自動的に生成(LineItemテイク4)
  343.    20.1.3 ディスクリプタ型の追加(LineItemテイク5)
  344.   20.2 オーバーライドディスクリプタと非オーバーライドディスクリプタ
  345.    20.2.1 オーバーライドディスクリプタ
  346.    20.2.2 __get__のないオーバーライドディスクリプタ
  347.    20.2.3 非オーバーライドディスクリプタ
  348.    20.2.4 クラスディスクリプタの上書き
  349.   20.3 メソッドはディスクリプタ
  350.   20.4 ディスクリプタの使い方
  351.   20.5 ディスクリプタのdocstringと削除処理のオーバーライド
  352.   20.6 本章のまとめ
  353.   20.7 参考文献
  354.  21章 クラスメタプログラミング
  355.   21.1 クラスファクトリ
  356.   21.2 ディスクリプタをカスタマイズするクラスデコレータ
  357.   21.3 インポートタイムとランタイムに起きること
  358.    21.3.1 評価のタイミング
  359.   21.4 メタクラスの基礎
  360.    21.4.1 メタクラスの評価タイミング
  361.   21.5 ディスクリプタをカスタマイズするメタクラス
  362.   21.6 メタクラスの特殊メソッド__prepare__
  363.   21.7 オブジェクトとしてのクラス
  364.   21.8 本章のまとめ
  365.   21.9 参考文献
  366.  あとがき
  367.   参考文献
  368.  付録A スクリプト
  369.   A.1 in演算子のパフォーマンス評価実験(3.9.1節)
  370.   A.2 ハッシュ値のビットパターン(3.9.2節)
  371.   A.3 __slots__のあるときとないときのRAM使用量(9.8節)
  372.   A.4 データベース変換スクリプト(14.13節)
  373.   A.5 タクシー運行の離散事象シミュレーション(16.9.2節)
  374.   A.6 暗号処理スクリプト(17.3節)
  375.   A.7 HTTPクライアント(17.5節)
  376.   A.8 Unicode文字ファインダ(18.6.1節)
  377.   A.9 OSCONデータ処理スクリプトとテスト用スクリプト(19.1.5節)
  378.  付録B 参考文献リンク
  379.   まえがき
  380.   1章
  381.   2章
  382.   3章
  383.   4章
  384.   5章
  385.   6章
  386.   7章
  387.   8章
  388.   9章
  389.   10章
  390.   11章
  391.   12章
  392.   13章
  393.   14章
  394.   15章
  395.   16章
  396.   17章
  397.   18章
  398.   19章
  399.   20章
  400.   21章
  401.   あとがき
  402.  付録C 参考文献
  403.  用語集
  404.  著者・訳者紹介
  405.  奥付

Product information

  • Title: Fluent Python ―Pythonicな思考とコーディング手法
  • Author(s): Luciano Ramalho, 豊沢 聡, 桑井 博之, 梶原 玲子
  • Release date: October 2017
  • Publisher(s): O'Reilly Japan, Inc.
  • ISBN: 9784873118178