Fluent Python 第2版

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

[cover photo]
TOPICS
Programming , Python
発行年月日
PRINT LENGTH
984
ISBN
978-4-8144-0128-4
原書
Fluent Python, 2nd Edition
FORMAT
Print
Print
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章についての私見