Python(パイソン)は世界中で広く使用されているオブジェクト指向言語で、スタンドアロンプログラムにも、様々な種類のスクリプトにも利用できます。豊富な機能を備えている一方で、非常に使いやすく、無料で入手できる、ポータブルである、といった特徴も備えています。本書は、プログラミングそのものがはじめての人から、他の言語で経験を積んでいる人まで、どちらの人にもPythonという言語の基本を比較的短い時間で学べるように作られています。本書を読めば、どのような種類のアプリケーションを作るにしても、必要な知識や技術が十分に身に付くようになっています。第3版はPython言語の変化への対応を中心に改訂され、Python 3.0を含めた新しいバージョンでの変更点についての解説を加えるとともに、将来新しいバージョンへ移行する際に役立つ情報も盛り込みました。Pythonの基礎を余すところなく解説するPython入門書の決定版です。
初めてのPython 第3版
Mark Lutz 著、夏目 大 訳
- TOPICS
- Programming , Python
- 発行年月日
- 2009年02月
- PRINT LENGTH
- 808
- ISBN
- 978-4-87311-393-7
- 原書
- Learning Python, Third Edition
- FORMAT
- Print PDF
目次
はじめに 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 おわりに 索引