Book description
一歩先行くパイソニスタを目指す人のためのPython解説書。Pythonはシンプルです。使い方を覚えるのも簡単で生産性を短期間で高めることができます。しかしこれは、Pythonに備わっている豊富な機能のほんの一部しか使っていないということでもあります。本書では、とても有用なのにあまり使われていないPythonの特徴的な機能を活用し効果的で慣用的なPythonコードを書く方法について解説します。読者は、Pythonicな思考とコーディング手法を身につけ、コードをより短く、より速く、より読みやすくする方法を学べます。本書では、どうすれば熟練のPython 3プログラマーになれるのかを徹底的に追及します。
Table of contents
- 大扉
- 原書大扉
- クレジット
- 献辞
- 賞賛の声
- 監訳者まえがき
- まえがき
- 対象となる読者
- 対象としていない読者
- 本書の構成
- 実践的なアプローチ
- 性能評価に使用したハードウェア
- Soapbox(個人的な議論)
- 用語集
- 対象とするPythonのバージョン
- 表記上のルール
- サンプルコードの使用について
- 意見と質問
- 謝辞
- 第I部 プロローグ
- 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 参考文献
- 第II部 データ構造
- 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 参考文献
- 第III部 オブジェクトとしての関数
- 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 参考文献
- 第IV部 慣用的なオブジェクト指向
- 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 参考文献
- 第V部 制御フロー
- 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.11 イテラブルを縮約する関数
- 14.12 関数iterの詳細
- 14.13 ジェネレータを使ったデータベース変換ユーティリティ
- 14.14 コルーチンとしてのジェネレータ
- 14.15 本章のまとめ
- 14.16 参考文献
- 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およびaiohttpによるダウンロード
- 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 参考文献
- 第VI部 メタプログラミング
- 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 参考文献リンク
- まえがき
- 1章
- 2章
- 3章
- 4章
- 5章
- 6章
- 7章
- 8章
- 9章
- 10章
- 11章
- 12章
- 13章
- 14章
- 15章
- 16章
- 17章
- 18章
- 19章
- 20章
- 21章
- あとがき
- 付録C 参考文献
- 用語集
- 著者・訳者紹介
- 奥付
Product information
- Title: Fluent Python ―Pythonicな思考とコーディング手法
- Author(s):
- Release date: October 2017
- Publisher(s): O'Reilly Japan, Inc.
- ISBN: 9784873118178
You might also like
book
Python One-Liners
Python One-Liners will teach you how to read and write “one-liners”: concise statements of useful functionality …
book
Python Workout
The only way to master a skill is to practice. In Python Workout, author Reuven M. …
book
Robust Python
Does it seem like your Python projects are getting bigger and bigger? Are you feeling the …
book
Using Asyncio in Python
If you’re among the Python developers put off by asyncio’s complexity, it’s time to take another …