Pythonプログラミング:コンピュータサイエンス入门
この教科書は、プログラミング言語Pythonを主な言語として使用し、コンピュータサイエンスの基礎的な原則を学ぶための入門レベルの大学教育用テキストです。問題解決、設計、プログラミングに焦点を当て、スパイラルカバー方式とグラフィックス指向アプローチを採用しています。
コース概要
📚 コンテンツ概要
これは、プログラミング言語Pythonを主な教材として用いて、コンピュータサイエンスの基礎原則を学ぶための入門レベルの大学教科書です。問題解決、設計、プログラミングの観点から、スパイラルカバレッジモデルとグラフィックス志向のアプローチを通じて学習を進めます。
Pythonを通して、コンピュータサイエンスの芸術へのやさしく、かつ包括的な導入。
著者: John M. Zelle
謝辞: Guido van Rossum(序文)、Jim Leisy、およびワートバーグ・カレッジおよびオーウェン・アストラカン、ケイ・ホーストマン、ネル・デールらを含むさまざまな大学の学術的同僚たち。
🎯 学習目標
- ハードウェア/ソフトウェア、アルゴリズム/プログラムの違いを明確に説明する。
- Pythonインタプリタが高レベルコードをバイトコード経由で実行可能な命令に変換する仕組みを説明する。
- パラメータと引数を使用して、簡単なPython関数を定義し呼び出す。
- ソフトウェア開発プロセスの6段階を列挙し、それぞれの内容を説明する。
- Pythonの構文ルールを適用し、有効な識別子および演算子優先順位を正しく扱った数学式を作成する。
- 「箱モデル」と「ステッカー・ノートモデル」の違いを区別し、評価と代入のプロセスを説明する。
int型とfloat型の違いを理解し、明示的な型変換を適用する。- 累積パターンを用いて階乗などの数学的問題を解く。
- Pythonの
mathライブラリを利用して、二次方程式を含む代数方程式を解く。 - オブジェクト指向の基本概念:オブジェクト、メソッド、アクセサ、ミューテータ、エイリアスを定義し適用する。
🔹 レッスン1:コンピュータサイエンスとPythonの基礎
概要: このレッスンでは、コンピュータサイエンスとは物理的な機械の研究ではなく、計算可能なプロセスの研究であることを紹介します。学生は「万能機械」という概念を学び、ソフトウェアによってハードウェアをあらゆる道具に変える力について探求します。最後に、インタプリタベースの実行、関数定義、構文と意味の違いといった、Pythonの基礎的な技術について技術的に導入します。
学習成果:
- ハードウェア/ソフトウェア、アルゴリズム/プログラムの違いを明確に説明する。
- Pythonインタプリタが高レベルコードをバイトコード経由で実行可能な命令に変換する仕組みを説明する。
- パラメータと引数を使用して、簡単なPython関数を定義し呼び出す。
🔹 レッスン2:ソフトウェア開発プロセスとシンプルなプログラム
概要: このレッスンでは、6段階の開発プロセスを通じた体系的なソフトウェア作成アプローチと、Pythonプログラミングの基本構成要素を紹介します。学生は識別子、式、代入などの基本構文を学びながら、「ステッカー・ノートモデル」と従来の概念との対比を考察します。レッスンの終わりには、range()関数を使って繰り返し計算を処理する確定ループ(定数ループ)の実装を行います。
学習成果:
- ソフトウェア開発プロセスの6段階を列挙し、それぞれの内容を説明する。
- Pythonの構文ルールを適用し、有効な識別子および演算子優先順位を正しく扱った数学式を作成する。
- 「箱モデル」と「ステッカー・ノートモデル」の違いを区別し、評価と代入のプロセスを説明する。
🔹 レッスン3:数値データ表現とmathライブラリ
概要: このレッスンでは、コンピュータが数値データをどのように表現・操作しているかを学びます。整数(離散的な整数)と浮動小数点数(実数の近似値)の違いを区別し、Pythonの組み込み演算子とmathライブラリを使って複雑な計算を行う方法を学びます。同時に、2進表現と精度に関する根本的な制約についても理解します。
学習成果:
int型とfloat型の違いを理解し、明示的な型変換を適用する。- 階乗などの数学的問題を解くために累積パターンを実装する。
- Pythonの
mathライブラリを使って、二次方程式を含む代数方程式を解く。
🔹 レッスン4:オブジェクト指向のグラフィックスとインタラクティブなGUI
概要: このレッスンでは、テキストベースのプログラミングから、オブジェクト指向(OO)アプローチを用いたグラフィカルユーザーインターフェース(GUI)へと移行します。学生は点、線、図形などのグラフィカルオブジェクトを操作し、座標系を管理し、マウスクリック、キーボード入力、テキスト入力に対応するインタラクティブなプログラムを作成します。
学習成果:
- オブジェクト指向の基本概念:オブジェクト、メソッド、アクセサ、ミューテータ、エイリアスを定義し適用する。
- 点(Point)、線(Line)、円(Circle)、長方形(Rectangle)、楕円(Oval)、多角形(Polygon)など、グラフィカルオブジェクトを構築し表示する。
- 座標変換とインタラクティブ要素(マウス/キーボード/入力ボックス)を実装し、機能的なGUIを作成する。
🔹 レッスン5:シーケンス:文字列、リスト、ファイル入出力
概要: このレッスンでは、コンピュータサイエンスがデータのシーケンスをどのように表現・操作しているかを探ります。特に文字列とリストに焦点を当てます。インデックスとスライシングの仕組み、可変オブジェクトと不変オブジェクトの重要な違い、外部データとのインターフェースをファイル処理を通じて学びます。また、Unicodeによるデータ符号化と、基本的なシフト暗号を用いた暗号理論の基礎原理もカバーします。
学習成果:
- インデックス、スライシング、組み込みメソッド(split, join, upper, lower)を使って、文字列およびリストの高度な操作を行う。
- 基本的な符号化/復号アルゴリズムおよび暗号化シフト(カエサル暗号、置換暗号)を設計・実装する。
- 外部データファイルを開き、読み取り、処理し、閉じるバッチ処理プログラムを開発する。
🔹 レッスン6:関数の定義と変数スコープ
概要: このレッスンでは、モノリスなスクリプトの記述から、関数を用いたモジュール構造のプログラムへの移行を学びます。関数の定義と呼び出しの構文、正式パラメータと実際パラメータを通じた情報の伝達メカニズム、戻り値(複数の値やNoneオブジェクトを含む)を通じた結果のやり取りについて学びます。また、変数スコープ(特にローカル変数とグローバル変数の違い)と、可変パラメータを変更することでプログラム状態に影響を与える仕組みについても学びます。
学習成果:
- コードの重複を減らし、プログラム構造を改善するために、関数を定義し呼び出す方法を示す。
- 正式パラメータと実際パラメータの違いを区別し、位置パラメータの一致の仕組みを説明する。
- 単一の値、複数の値、またはデフォルトで
Noneオブジェクトを返す関数を実装する。
🔹 レッスン7:決定構造と例外処理
概要: このレッスンでは、特定の条件に基づいて異なる命令の実行を可能にする決定構造を導入します。学生は関係演算子を使ってブール式を形成し、単方向、二方向、多方向の決定を実装し、ネスト構造で複雑な論理を扱う方法を学びます。また、__name__変数を使ったモジュール実行と、try-except構文による堅牢なエラー管理もカバーします。
学習成果:
if、else、elifを使って、シンプルな、二方向、多方向の決定構造を実装する。- 関係演算子と文字列の辞書順序を使って、ブール式を構成・評価する。
try-exceptパターンを適用し、ランタイムエラーを処理してプログラムのクラッシュを防ぐ。
🔹 レッスン8:不定ループとブール論理
概要: このレッスンでは、固定回数の「カウントされた」ループから、不定ループへと移行します。不定ループは、固定された繰り返し回数ではなく、条件に基づいて実行されます。学生はwhile文をマスターし、データ処理のためのさまざまな設計パターン(インタラクティブループ、センチネルループ、プライミングリードパターン)を学びます。さらに、ブール論理についても学び、複雑な意思決定構造をコード内で構築・簡略化するための代数的ツールを提供します。
学習成果:
- Pythonの
while文を使って、不定ループを設計・実装する。 - 代表的なループパターン、特にインタラクティブループ、センチネルループ、プライミングリードパターンを適用する。
- ブール代数とド・モーガンの法則を使って、複雑な論理条件を簡略化する。
🔹 レッスン9:シミュレーション、設計、段階的精査
概要: このレッスンでは、トップダウン設計と段階的精査を通じて、複雑なコンピュータプログラムを開発する体系的なプロセスを探索します。学生は抽象化とモジュール化を用いて、大きな問題を管理可能な「小さな塊」に分解する方法を学び、構造チャートを使ってプログラムの階層を視覚化し、モンテカルロ技法を用いてシミュレーションを実装します。カリキュラムでは、プロトタイピングやスパイラル開発といった反復的開発戦略、およびユニットテストといった堅牢なテスト手法もカバーします。
学習成果:
- トップダウン設計を用いて、複雑な問題をより小さい、解決可能な部分問題に分解する。
- モジュール間のデータフロー(パラメータと戻り値)を示す構造チャートを構築・解釈する。
- プログラムの
randomライブラリを活用し、モンテカルロシミュレーション技法を用いて確率的イベントをモデル化する。
🔹 レッスン10:クラスの定義とイベント駆動型プログラミング
概要: このレッスンでは、手続き型・関数ベースの設計から、Pythonのクラスを用いたオブジェクトベースの設計へと移行します。学生はデータ(インスタンス変数)と振る舞い(メソッド)を一つの単位に封印する方法を学び、インタラクティブなグラフィカルユーザーインターフェース(GUI)ウィジェットを作成し、イベント駆動型プログラミングと同期アニメーションループを通じてプログラムの流れを管理します。
学習成果:
- 関数ベースの設計とオブジェクトベースの設計の違いを区別する。
- コンストラクタ(
__init__)、インスタンス変数、selfパラメータを使って、カスタムのPythonクラスを定義する。 - ドキュメント文字列(docstrings)を用いて、カプセル化とドキュメント化を実装する。
🔹 レッスン11:データコレクション:高度なリストとディクショナリー
概要: このレッスンでは、Pythonにおける高度なデータ収集技術を探索します。特に、リストとディクショナリーの柔軟性に焦点を当てます。学生はリストと従来の配列との違いを理解し、スライシングやレコードのソートといった複雑なリスト操作を学び、ディクショナリーによる非順序マッピングを応用します。このモジュールの最終段階では、これらの構造を統計分析やエラトステネスの篩といった古典的アルゴリズムに応用します。
学習成果:
- 固定サイズかつ同質の配列と、動的で柔軟なPythonのリストの違いを比較する。
- スライシング、選択的削除、オブジェクトレコードのカスタムソートなどを含む、高度なリスト操作を行う。
- 平均、中央値、標準偏差といった統計アルゴリズムと、テーブル駆動設計をコレクションを使って実装する。
🔹 レッスン12:オブジェクト指向設計(OOD)の原則
概要: このレッスンでは、トップダウンの機能設計から、データ中心のアプローチであるオブジェクト指向設計(OOD)への移行を学びます。システムは「ブラックボックス」(オブジェクト)の集合として記述され、相互作用する構造になります。学生は問題文から候補となるクラスとメソッドを特定し、ラケットボールやダイスポーカーのような複数クラスのシミュレーションを実装します。三つのオブジェクト指向の柱:カプセル化、ポリモーフィズム、継承を適用します。レッスンの最終段階では、サブクラス化とメソッドのオーバーライドを通じて、複雑なグラフィカルユーザーインターフェース(GUI)の相互作用を管理します。
学習成果:
- 問題文から名詞と動詞を分析し、潜在的なクラスとメソッドを特定する。
- 構造化されたクラス(例:
Player、Game、Stats)を使って、複雑なマルチオブジェクトシミュレーションを実装する。 - カプセル化、ポリモーフィズム、継承の基本概念を区別し、適用する。
🔹 レッスン13:アルゴリズム設計、再帰、効率性
概要: このレッスンでは、計算問題を効率的に解決するために使われる基本的手法を探ります。探索戦略、再帰的問題解決の仕組み(基底ケースと再帰ステップ)、選択ソートとマージソートといったソートアルゴリズムの比較を通じて、アルゴリズム設計が性能に与える影響を理解します。
学習成果:
- 線形探索と二分探索の戦略を比較し、実装する。
- 文字列の逆転や高速べき乗といった問題に対して、基底ケースと再帰ステップを用いた再帰関数を設計する。
- 再帰と反復、および異なるソートアルゴリズム(n^2 vs. n \log n)のパフォーマンストレードオフを分析する。