初めてのPython 第3版を読破するぞ! しかし分厚いな・・・808ページ。


はじめに

I部 Pythonの基礎知識

1章 PythonについてのQ&A
1.1 Pythonを使うメリットは何ですか?
1.1.1 ソフトウェアのクオリティ
1.1.2 生産性の高さ
1.2 Pythonはスクリプト言語なのですか?
1.3 Pythonの欠点は何ですか?
1.4 Pythonのユーザ数はどのくらいですか? また、どんな人がPythonを使っているのですか?
1.5 Pythonを使うとどんなことができるのですか?
1.5.1 システムプログラミング
1.5.2 GUI
1.5.3 インターネットスクリプティング
1.5.4 コンポーネントの統合
1.5.5 データベースプログラミング
1.5.6 ラピッドプロトタイピング
1.5.7 数値計算(科学研究向け)プログラミング
1.5.8 ゲーム、画像処理、AI、XML、その他
1.6 Pythonの技術的な長所は何ですか?
1.6.1 オブジェクト指向
1.6.2 フリー
1.6.3 ポータブル
1.6.4 高機能
1.6.5 他言語との連携が容易
1.6.6 使いやすい
1.6.7 学習しやすい
1.6.8 モンティ・パイソンとの関係
1.7 他言語とPythonの比較
1.8 1章のまとめ
1章の練習問題

2章 Pythonプログラムの実行
2.1 Pythonインタプリタ
2.2 プログラムの実行
2.2.1 プログラマの視点
2.2.2 Pythonインタプリタの視点
2.3 実行モデルのバリエーション
2.3.1 Pythonシステムの種類
2.3.2 実行最適化ツール
2.3.3 フローズンバイナリ
2.3.4 今後の予測
2.4 2章のまとめ
2章の練習問題

3章 プログラムの起動方法
3.1 対話型プログラミング
3.1.1 対話型プロンプト利用上の注意
3.2 プログラム(モジュール)ファイル
3.2.1 システムのコマンドラインを使用してPythonプログラムを実行する際の注意事項
3.2.2 UNIXの実行可能スクリプト
3.3 ファイルアイコンのクリック
3.3.1 アイコンクリックによるプログラムの起動
3.3.2 raw_input関数
3.3.3 アイコンクリックによる起動のその他の問題点
3.4 モジュールのインポートとリロード
3.4.1 モジュールの属性
3.4.2 インポート、リロードだけに頼るのは危険
3.5 IDLEユーザインタフェース
3.5.1 IDLEの基礎
3.5.2 IDLEの使用に関する注意事項
3.5.3 IDLEの高度なツール
3.6 IDLE以外のIDE
3.7 他の言語のプログラムへの組み込み
3.8 フローズンバイナリ
3.9 テキストエディタによるプログラムの起動
3.10 その他の起動方法
3.11 今後の可能性
3.12 起動方法の選択
3.13 3章のまとめ
3章の練習問題
I部のまとめ演習

II部 ビルトインオブジェクト

4章 Pythonのビルトインオブジェクト
4.1 ビルトインオブジェクト
4.1.1 ビルトインオブジェクトの型
4.2 数値
4.3 文字列
4.3.1 シーケンスの操作
4.3.2 不変性
4.3.3 文字列に固有のメソッド
4.3.4 ヘルプ
4.3.5 文字列の作り方のバリエーション
4.3.6 パターンマッチング
4.4 リスト
4.4.1 シーケンス操作
4.4.2 リストに固有のメソッド
4.4.3 要素の存在チェック
4.4.4 ネスト
4.4.5 リスト内包表記
4.5 ディクショナリ
4.5.1 写像の操作
4.5.2 ネスト
4.5.3 キーのソート:forループ
4.5.4 反復処理と最適化
4.5.5 存在しないキー:ifテスト
4.6 タプル
4.6.1 なぜタプルが必要なのか
4.7 ファイル
4.7.1 ファイル関連ツール
4.8 その他の型
4.8.1 型のチェック
4.8.2 ユーザの作るクラス
4.8.3 オブジェクトは他にもある
4.9 4章のまとめ
4章の練習問題

5章 数値
5.1 数値
5.1.1 数値リテラル
5.1.2 ビルトインツールとエクステンション
5.2 Pythonの式と演算子
5.2.1 演算子の組み合わせ(優先順位)
5.2.2 優先度を明確にするにはカッコを使う
5.2.3 式中での型の混在
5.2.4 演算子のオーバーロード
5.3 数値の使用例
5.3.1 変数と演算
5.3.2 数値の表現
5.3.3 除算の種類
5.3.4 ビット演算
5.3.5 長整数
5.3.6 複素数
5.3.7 16進数と8進数
5.3.8 数値処理のためのビルトインツール
5.4 その他の数値型
5.4.1 小数型
5.4.2 集合
5.4.3 ブール型
5.4.4 サードパーティエクステンション
5.5 5章のまとめ
5章の練習問題

6章 ダイナミックな型付け
6.1 型宣言がないPython
6.1.1 変数の扱い
6.1.2 型の情報は変数ではなくオブジェクトが持つ
6.1.3 ガーベージコレクション
6.2 共有リファレンス
6.2.1 共有リファレンスとオブジェクトの上書き
6.2.2 「同等」と「同一」
6.3 ダイナミックな型付けはすべての基礎
6.4 6章のまとめ
6章の練習問題

7章 文字列
7.1 文字列リテラル
7.1.1 シングルクォーテーションとダブルクォーテーションは同じ意味を持つ
7.1.2 エスケープシーケンス
7.1.3 raw文字列
7.1.4 トリプルクォーテーション
7.1.5 Unicode文字列
7.2 文字列の利用
7.2.1 基本的な演算
7.2.2 インデクシングとスライシング
7.2.3 文字列と数値の間の変換
7.2.4 文字列に変更を加える
7.3 文字列フォーマット
7.3.1 文字列フォーマットに使用するコード
7.3.2 ディクショナリを使用した文字列フォーマット
7.4 文字列のメソッド
7.4.1 文字列メソッドの呼び出しパターン
7.4.2 文字列の分解
7.4.3 その他の文字列メソッドの使用例
7.4.4 stringモジュール
7.5 型のカテゴリ
7.5.1 カテゴリが同じなら行える操作も同じ
7.5.2 不変性を持つオブジェクト
7.6 7章のまとめ
7章の練習問題

8章 リストとディクショナリ
8.1 リスト
8.2 リストの利用
8.2.1 基本的な操作
8.2.2 インデクシング、スライシング、行列の表現
8.2.3 リストへの変更
8.3 ディクショナリ
8.4 ディクショナリの利用
8.4.1 基本的な操作
8.4.2 ディクショナリの変更(上書き)
8.4.3 ディクショナリのメソッド
8.4.4 ディクショナリの応用例
8.4.5 ディクショナリ使用上の注意点
8.5 8章のまとめ
8章の練習問題

9章 タプル、ファイルオブジェクト、その他
9.1 タプル
9.1.1 タプルの基本的な操作
9.1.2 タプルはなぜ必要か
9.2 ファイル
9.2.1 ファイルの基本的な操作
9.2.2 ファイルの使用
9.2.3 ファイルオブジェクトの使用例
9.2.4 その他のファイルツール
9.3 ビルトイン型の分類
9.4 複合型オブジェクトの類似点、相違点
9.5 リファレンスとコピー
9.6 比較とブール値
9.6.1 TrueまたはFalseと解釈されるオブジェクト
9.7 ビルトインオブジェクト間の関係
9.8 その他のオブジェクト
9.9 ビルトインオブジェクトに関する注意事項
9.9.1 変数にオブジェクトを代入すると、コピーではなく、リファレンスが作られる
9.9.2 繰り返し演算によるネスト
9.9.3 循環オブジェクト
9.9.4 不変性オブジェクトは上書きができない
9.10 9章のまとめ
9章の練習問題
II部のまとめ演習

III部 ステートメント

10章 Pythonのステートメント
10.1 Pythonプログラムの構造
10.1.1 Pythonのステートメント
10.2 ifの比較
10.2.1 Pythonに特有の要素
10.2.2 Pythonにない要素
10.2.3 なぜ字下げか
10.2.4 特殊なケース
10.3 簡単なステートメントの例
10.3.1 簡単なループ
10.3.2 ユーザの入力したデータを利用して計算をする
10.3.3 入力が適切でない場合
10.3.4 tryステートメントでエラーを処理する
10.3.5 ステートメントを二重にネストする
10.4 10章のまとめ
10章の練習問題

11章 代入ステートメント、式ステートメント、printステートメント
11.1 代入ステートメント
11.1.1 代入ステートメントの形式
11.1.2 シーケンスの代入
11.1.3 マルチターゲット代入
11.1.4 拡張代入ステートメント
11.1.5 変数名に関するルール
11.2 式ステートメント
11.2.1 式ステートメントと上書き
11.3 printステートメント
11.3.1 Hello Worldプログラム
11.3.2 出力ストリームのリダイレクト(出力先の変更)
11.3.3 >>を使用したリダイレクト
11.4 11章のまとめ
11章の練習問題

12章 ifステートメント
12.1 ifステートメントとは
12.1.1 ifステートメントの形式
12.1.2 ifステートメントの例
12.1.3 多分岐
12.2 Pythonの構文に関するルール
12.2.1 ブロックの区切り
12.2.2 ステートメントの区切り
12.2.3 1行1ステートメントの原則に従わないコードの例
12.3 Pythonのブール演算
12.3.1 if/else式
12.4 12章のまとめ
12章の練習問題

13章 whileループとforループ
13.1 whileループ
13.1.1 whileステートメントの形式
13.1.2 whileステートメントの使用例
13.2 break、continue、passステートメントとelseブロック
13.2.1 break、continueステートメントやelseブロックを含むwhileループの形式
13.2.2 break、continue、passステートメントやelseブロックを含むwhileループの使用例
13.3 forループ
13.3.1 forステートメントの形式
13.3.2 forループの使用例
13.4 反復処理
13.4.1 ファイルを対象とした反復処理
13.4.2 他のオブジェクトへの反復処理
13.4.3 forループ以外での反復処理
13.4.4 ユーザ定義の関数やクラスを反復処理に対応させる
13.5 特殊なforループ
13.5.1 range関数の利用
13.5.2 シーケンスへの変則的なアクセスへのrange関数の利用
13.5.3 シーケンスを更新するforループ
13.5.4 zip関数の利用
13.5.5 インデックスと要素を生成する:enumerate関数
13.6 リスト内包表記の概要
13.6.1 リスト内包表記の基礎
13.6.2 リスト内包表記をファイルに対して使用する
13.6.3 リスト内包表記の拡張構文
13.7 13章のまとめ
13章の練習問題
14章 Pythonのドキュメント
14.1 ドキュメントについての基礎知識
14.1.1 ドキュメントの種類
14.1.2 # を使用したコメント
14.1.3 dir関数
14.1.4 ドキュメンテーション文字列
14.1.5 PyDoc:help関数
14.1.6 PyDoc:GUIインタフェース
14.1.7 標準マニュアルセット
14.1.8 Webサイト
14.1.9 Pythonに関する書籍
14.2 ステートメント、構文についての注意事項
14.3 14章のまとめ
14章の練習問題
III部のまとめ演習

IV部 関数

15章 関数の基礎
15.1 関数とは
15.2 関数のコードの書き方、関数の使い方
15.2.1 defステートメント
15.2.2 defステートメントのネスト
15.3 関数の実例1
15.3.1 定義
15.3.2 呼び出し
15.3.3 ポリモーフィズム
15.4 関数の実例2
15.4.1 定義
15.4.2 呼び出し
15.4.3 ポリモーフィックな関数
15.4.4 ローカル変数
15.5 15章のまとめ
15章の練習問題

16章 スコープと引数
16.1 スコープに関するルール
16.1.1 スコープの基礎知識
16.1.2 LEGBルール
16.1.3 コード例
16.1.4 ビルトインスコープ
16.2 globalステートメント
16.2.1 グローバル変数は最小限にする
16.2.2 ファイルをまたいでの変更はできるだけ避ける
16.2.3 グローバル変数への特殊なアクセス法
16.3 ネストスコープ
16.3.1 変数の扱い
16.3.2 ネストスコープを持つコードの例
16.4 引数
16.4.1 引数と共有リファレンス
16.4.2 呼び出し側への影響を回避する
16.4.3 参照渡しと同様の結果を得る
16.5 引数のバリエーション
16.5.1 位置によるマッチングと名前によるマッチング
16.5.2 *と**の使用例
16.5.3 キーワード引数とデフォルト値を組み合わせる
16.5.4 引数のバリエーションの応用例
16.5.5 2つの関数
16.5.6 引数に関する注意事項
16.6 16章のまとめ
16章の練習問題

17章 関数に関連する高度なテクニック
17.1 lambda式
17.1.1 lambda式の基本
17.1.2 lambda式の特徴
17.1.3 ステートメントを式に書き直す
17.1.4 lambda式とネストスコープ
17.2 apply関数
17.2.1 apply関数の使用例
17.2.2 apply関数を使用しない方法
17.3 map関数
17.4 map関数と類似した関数:filterとreduce
17.5 リスト内包表記
17.5.1 簡単なリスト内包表記の例
17.5.2 リスト内包表記で使用するループとif
17.5.3 リスト内包表記とマトリクス
17.5.4 リスト内包表記のデメリット
17.6 ジェネレータとイテレータ
17.6.1 ジェネレータの例
17.6.2 ジェネレータ関数プロトコルの拡張:sendとnext
17.6.3 イテレータとビルトイン型
17.6.4 ジェネレータ式:イテレータとリスト内包表記の融合
17.7 実行速度の計測
17.8 関数を作る際のコツ
17.8.1 関数はオブジェクトとして扱われる
17.9 関数についての注意事項
17.9.1 変数がローカルスコープに属するかどうかはスタティックに決定される
17.9.2 デフォルト値が可変性オブジェクトである場合は上書きに注意
17.9.3 戻り値のない関数
17.9.4 ネストスコープのループ
17.10 17章のまとめ
17章の練習問題
IV部のまとめ演習

V部 モジュール

18章 モジュールとインポート
18.1 モジュールを利用するメリット
18.2 Pythonプログラムの基本構造
18.2.1 トップレベルファイルとモジュール
18.2.2 インポートと属性
18.2.3 標準ライブラリモジュール
18.3 インポートの処理
18.3.1 インポート対象のモジュールファイルを探す
18.3.2 見つかったファイルのコードをコンパイルする
18.3.3 モジュールのコードを実行する
18.4 18章のまとめ
18章の練習問題

19章 モジュールのインポート、リロード
19.1 モジュールの作成
19.2 モジュールを利用する
19.2.1 importステートメント
19.2.2 fromステートメント
19.2.3 from *ステートメント
19.2.4 インポートは1回だけ行われる
19.2.5 importステートメント、fromステートメントでは「代入」が行われる
19.2.6 変数の更新
19.2.7 importとfromの違い
19.2.8 fromステートの問題点
19.3 名前空間としてのモジュール
19.3.1 モジュールファイルから名前空間へ
19.3.2 属性へのアクセス
19.3.3 インポートとスコープの関係
19.3.4 名前空間のネスト
19.4 モジュールのリロード
19.4.1 reload関数
19.4.2 リロードの実例
19.5 19章のまとめ
19章の練習問題

20章 パッケージインポート
20.1 パッケージインポートのためのコード
20.1.1 パッケージインポートとモジュールサーチパス
20.1.2 __init__.pyファイル
20.2 パッケージインポートの実例
20.2.1 パッケージインポートにおけるfromとimportの違い
20.3 パッケージインポートのメリット
20.3.1 プログラム間でのモジュール名の重複
20.4 20章のまとめ
20章の練習問題

21章 モジュールに関連する高度なテクニック
21.1 データの隠蔽
21.1.1 下線と__all__属性
21.2 拡張機能を有効にする
21.3 __name__属性
21.3.1 __name__属性の応用
21.4 プログラムの中でモジュールサーチパスの設定を変更する
21.5 モジュールに別名を付ける
21.6 相対インポートの構文
21.6.1 なぜfromステートメントの仕様が変更されるのか
21.7 モジュールの設計
21.7.1 メタプログラム
21.8 モジュールについての注意事項
21.8.1 トップレベルのコードではステートメントの順序に注意
21.8.2 import、fromに指定するモジュール名は「変数名」
21.8.3 fromによって作られる変数と元の変数の間につながりはない
21.8.4 from *を使うと変数の意味がわかりにくくなる
21.8.5 fromによってコピーされた変数はリロードの影響を受けない
21.8.6 fromステートメントと対話型コマンドライン
21.8.7 リロードは自動的には行われない
21.8.8 再帰インポート
21.9 21章のまとめ
21章の練習問題
V部のまとめ演習

VI部 クラスとオブジェクト指向プログラミング

22章 Pythonでのオブジェクト指向プログラミング
22.1 クラスとは
22.2 オブジェクト指向プログラミング
22.2.1 属性の検索
22.2.2 クラスとインスタンス
22.2.3 クラスのメソッド
22.2.4 オブジェクトツリーの作成
22.2.5 コードの再利用、カスタマイズ
22.3 22章のまとめ
22章の練習問題

23章 クラスのコーディング(基礎)
23.1 インスタンスオブジェクトは1つのクラスから複数作ることができる
23.1.1 クラスオブジェクト
23.1.2 インスタンスオブジェクト
23.1.3 クラスの実例
23.2 クラスは継承によってカスタマイズできる
23.2.1 サブクラスの実例
23.2.2 クラスとモジュール
23.3 クラスでは演算子のオーバーロードができる
23.3.1 演算子のオーバーロードの実例
23.3.2 演算子のオーバーロードをしないとどうなるか
23.4 世界一簡単なPythonクラス
23.5 23章のまとめ
23章の練習問題

24章 クラスのコーディング(詳細)
24.1 classステートメント
24.1.1 classステートメントの書式
24.1.2 classステートメントの実例
24.2 メソッド
24.2.1 メソッドの実例
24.2.2 スーパークラスのコンストラクタを呼び出す
24.2.3 特殊なメソッド
24.3 継承
24.3.1 属性ツリーの構築
24.3.2 継承したメソッドのカスタマイズ
24.3.3 サブクラスのバリエーション
24.3.4 抽象クラス
24.4 演算子のオーバーロード
24.4.1 演算子オーバーロード用のメソッド
24.4.2 __getitem__:インデクシング
24.4.3 __getitem__:反復処理への対応
24.4.4 独自のイテレータの作成
24.4.5 __getattr__と__setattr__
24.4.6 属性の隠蔽
24.4.7 __repr__と__str__
24.4.8 __radd__
24.4.9 __call__
24.4.10 イベントハンドラとしてインスタンスを登録
24.4.11 __del__
24.5 名前空間に関する注意事項
24.5.1 非修飾名
24.5.2 修飾名:特定のオブジェクトの名前空間
24.5.3 スコープの決まり方:値が代入される場所
24.5.4 名前空間の実体はディクショナリ
24.5.5 __class__属性とクラスの__bases__属性
24.6 本格的なコード例
24.7 24章のまとめ
24章の練習問題

25章 クラスと設計
25.1 Pythonとオブジェクト指向プログラミング
25.1.1 引数によって機能が変わるメソッドを作る
25.2 クラスをデータの集合として使う
25.3 IS-A関係
25.4 HAS-A関係
25.4.1 Processorクラス
25.5 デリゲーション
25.6 多重継承
25.7 ファクトリ
25.7.1 ファクトリのメリット
25.8 結合メソッドと非結合メソッド
25.9 ドキュメンテーション文字列
25.10 クラスとモジュール
25.11 25章のまとめ
25章の練習問題

26章 クラスに関連する高度なテクニック
26.1 ビルトインオブジェクトの拡張
26.1.1 デリゲーションによる拡張
26.1.2 サブクラス作成によるビルトインオブジェクトの機能拡張
26.2 属性の擬似的な「隠蔽」
26.2.1 ネームマングリングとは
26.2.2 ネームマングリングを行うメリット
26.3 新スタイルクラス
26.3.1 ダイアモンド継承への対処の違い
26.3.2 新スタイルクラスのその他の特徴
26.4 メソッドをインスタンスなしで呼び出すことはできない
26.4.1 スタティックメソッドとクラスメソッドの使い方
26.5 関数デコレータ
26.5.1 関数デコレータの例
26.6 クラスについての注意事項
26.6.1 属性変更の副作用
26.6.2 多重継承したクラスの優先順位
26.6.3 メソッド、クラスを関数にネストした場合のスコープ
26.6.4 プログラムの抽象化
26.7 26章のまとめ
26章の練習問題
VI部のまとめ演習

VII部 例外

27章 例外の基礎
27.1 例外の用途
27.1.1 例外の役割
27.2 例外処理の基本
27.3 try/except/elseステートメント
27.3.1 tryステートメントのブロック
27.3.2 elseブロック
27.3.3 デフォルトの例外処理
27.3.4 ビルトイン例外の処理
27.4 try/finallyステートメント
27.4.1 try/finallyステートメントの例
27.5 try/except/finallyステートメント
27.5.1 ネストによってfinallyとexceptを混在させる
27.5.2 finallyとexceptを混在させたコードの例
27.6 raiseステートメント
27.6.1 ユーザ定義例外の発生と処理
27.6.2 例外とともにデータを渡す
27.6.3 例外の再発生
27.7 assertステートメント
27.7.1 プログラム開発への例外の応用
27.8 with/asステートメント
27.8.1 基本的な使い方
27.8.2 コンテキスト管理プロトコル
27.9 27章のまとめ
27章の練習問題

28章 文字列例外とクラス例外
28.1 文字列例外
28.1.1 文字列例外は推奨されない
28.2 クラス例外
28.2.1 クラス例外の実例
28.2.2 クラス例外のメリット
28.2.3 ビルトイン例外
28.2.4 メッセージの改良
28.2.5 インスタンスに例外に関する情報を持たせる
28.3 raiseステートメントの書式
28.4 28章のまとめ
28章の練習問題

29章 例外と設計
29.1 例外ハンドラのネスト
29.1.1 関数呼び出しによるネスト
29.1.2 コード上でのネスト
29.2 例外の活用方法
29.2.1 例外はエラーに対応するとは限らない
29.2.2 処理結果の通知
29.2.3 プログラムのコード全体をtryステートメントの中に入れる
29.2.4 テストプログラムの作成
29.2.5 sys.exc_info
29.3 例外に関する「設計」の問題
29.3.1 どのコードをtryステートメントに入れるか
29.3.2 exceptブロックの対応範囲を広げすぎない
29.3.3 対応範囲が狭すぎるのも問題
29.4 例外についての注意事項
29.4.1 文字列例外のマッチングはオブジェクトが同一かどうかを基準に行われる
29.4.2 余分な例外を捕まえないようにする
29.5 言語の「コア部分」以外についての解説
29.5.1 Pythonのツールセット
29.5.2 大規模プログラムのための開発ツール
29.6 29章のまとめ
29章の練習問題
VII部のまとめ演習

付録A インストールと環境設定
A.1 Pythonインタプリタのインストール
A.1.1 Pythonが手元にあるかの確認
A.1.2 Pythonをどこで入手するか
A.1.3 インストールの手順
A.2 Pythonの環境設定
A.2.1 Pythonに関連する環境変数
A.2.2 環境変数の設定方法

付録B 演習問題の解答
B.1 I部 Pythonの基礎知識
B.2 II部 ビルトインオブジェクト
B.3 III部 ステートメント
B.4 IV部 関数
B.5 V部 モジュール
B.6 VI部 クラスとオブジェクト指向プログラミング
B.7 VII部 例外

付録C さらに新しいバージョンのPythonについて
C.1 新バージョンの位置づけ
C.1.1 新機能と後方互換性
C.2 歴史
C.3 変更点とその裏にある思想
C.3.1 誤ちを正す
C.3.2 トレードオフの変更
C.3.3 新しいパラダイムの導入
C.3.4 より統一的に
C.4 おわりに

索引