索引 / 001 JA
Pythonプログラミング入門: コンピュータ科学者として考える方法 cover

コンピュータサイエンス

コンピュータサイエンス

Pythonプログラミング入門: コンピュータ科学者として考える方法

Allen B. Downey

英語原題: Think Python: How to Think Like a Computer Scientist

コンピュータサイエンスとPythonプログラミングの明確で実践的な入門書。基本からデータ構造、オブジェクト指向の概念、アルゴリズム、問題解決までをカバー。

難易度レベル
初級
学術レベル
学部
Pythonプログラミングコンピュータサイエンスプログラミング入門データ構造オブジェクト指向問題解決

01 / 読書ガイド

読書ガイド

引用

Downey, A. B. (2024). Think Python: How to Think Like a Computer Scientist (3rd ed.). O'Reilly Media. 公式の無料版:https://allendowney.github.io/ThinkPython/

章の要約

全19章の各章は Jupyter ノートブックで、ブラウザ上の Colab で実行できる。第1〜18章は用語集と演習問題で終わり、多くの章にはそのテーマで起こりがちな誤りを扱う「デバッグ」の節がある。

第1章:思考の方法としてのプログラミング

プログラミングを、数学・工学・科学の長所を併せ持つ思考の方法として提示する章である。算術演算子、式、値と型、文字列、形式言語と自然言語の違いを扱い、以降の章で使う用語を導入する。

第2章:変数と文

代入、状態図、変数名、import 文、式と文の違い、print、引数、コメントを扱う。

第3章:関数

関数の定義と呼び出し、パラメータ、for と range によるループ、ローカル変数、スタック図、トレースバックを扱う。例にはモンティ・パイソンの歌詞が使われ、章の最後で関数を書く意義が問われる。

第4章:関数とインターフェース

タートルグラフィックスのモジュールで正方形・多角形・円を描きながら、カプセル化、一般化、リファクタリング、開発計画、docstring を学ぶ。主題は、互いにうまく組み合わさる関数のインターフェース設計である。

第5章:条件分岐と再帰

整数除算と剰余、ブール式、if・else、連鎖した条件と入れ子の条件に続いて、再帰、再帰関数のスタック図、無限再帰、キーボード入力を扱う。

第6章:戻り値

値を返す関数と None を返す関数、段階的開発、ブール関数、戻り値を伴う再帰、再帰における「信じて飛び込む」考え方、フィボナッチ数、型の確認を扱う。

第7章:反復と探索

文字列やファイル内の単語についてのループ、変数の更新、カウント、in 演算子と線形探索を扱い、「英単語のうち文字 e を含むものはどれだけあるか」という問いが全体の枠組みになる。doctest も導入され、演習には Spelling Bee というパズルがある。

第8章:文字列と正規表現

シーケンスとしての文字列、スライス、不変性、比較、文字列メソッドに続いて、ファイルへの書き込み、検索と置換、正規表現、文字列の置換を扱う。演習では単語ゲームの Wordle を使う。

第9〜11章:リスト;辞書;タプル

中心となる3つのデータ構造を扱う。第9章はリストの演算、メソッド、ソート、エイリアス、リスト引数、第10章は写像としての辞書、カウンタ、ループ、リストの蓄積、メモ化、第11章はタプルの不変性、タプル代入、戻り値としてのタプル、引数のパッキング、zip、ソート、辞書の反転を扱う。演習では回文やアナグラムなどの単語パズルが続く。

第12章:テキストの分析と生成

小説に含まれる異なり語数と語の頻度を数え、続いてバイグラム、マルコフ解析、新しいテキストの生成へ進む。これらのアルゴリズムが大規模言語モデルの一部に似ていることにも触れている。

第13章:ファイルとデータベース

ファイル名とパス、f 文字列、YAML と shelve によるデータの保存、同一内容のファイルの確認、ディレクトリの走査を扱う。最後の演習は、ディレクトリツリーから重複した写真を探すことである。

第14〜16章:クラスと関数;クラスとメソッド;クラスとオブジェクト

オブジェクト指向プログラミングを3段階で紹介する。第14章は Time クラスを定義し、属性、純粋関数、プロトタイプとパッチ、設計先行の開発を扱う。第15章は関数をメソッドに書き換え、静的メソッド、str、init、演算子のオーバーロードを加える。第16章は Point・Line・Rectangle の各クラスを使って、等価性と同一性、ディープコピー、ポリモーフィズムを説明する。

第17章:継承

トランプのカードと山札を通しの例として、親クラスと子クラス、特殊化を扱う。カードの表現、比較、ソートに重点がある。

第18章:Python の補足

それまでの章で省かれた機能として、集合、Counter、defaultdict、条件式、リスト内包表記、any と all、名前付きタプル、キーワード引数のパッキングを扱う。「デバッグ」の節では doctest に加えて unittest を紹介する。

第19章:おわりに

学習を続けるための提案をまとめた章で、著者によるデータサイエンスやモデリングの他の著書、仮想アシスタントなどのツールや他の開発環境、Python のユーザーグループ、もう一つの言語を学ぶこと(関数型言語を推奨)が挙げられている。

主要概念

第1〜6章:基礎、関数、再帰

  • 値・型・式:プログラムについて語るための語彙。エラーメッセージやドキュメントを読めるようにするため、最初に導入される。
  • スタック図:関数フレームの図で、ローカル変数や再帰呼び出しを追うのに使う。
  • 段階的開発:関数を小さく検証可能な段階に分けて作る方法で、第6章でも使われる。

第7〜13章:文字列、コレクション、ファイル

  • 線形探索:シーケンスの要素を順に調べるパターンで、第7章の中心である。
  • エイリアスと可変性:複数の名前が一つのリストを指す状況と、タプルや文字列をその場で変更できない理由。
  • 写像としての辞書:キーによる直接の参照で、カウント、メモ化、マルコフ解析に使われる。
  • 永続化:ファイル、YAML、shelve により、プログラムの実行後もデータを残すこと。

第14〜18章:オブジェクトと Python の補足

  • プログラマ定義型:データと操作をまとめたクラス。
  • 純粋関数とメソッド:同じ操作をまず関数として書き、次にクラス内に移す。
  • 継承とポリモーフィズム:子クラスによるクラスの再利用と、異なるクラスのオブジェクトを同じように扱えるコード。
  • テスト:前半の章では doctest、第18章では unittest。

批判的分析

長所

  • 意図的に絞られた言語の部分集合。 序文は、最小限の概念で最大の能力を得られる部分に絞ると述べており、省かれた便利な機能は第18章にまとめられている。
  • 用語を意識して教える。 用語は初出時に定義され、各章末の用語集で復習される。序文は、初心者が学ぶべき二つ目のものがプログラムについて語る言葉だと説明している。
  • デバッグとテストの組み込み。 ほぼ全章に「デバッグ」の節があり、第3版では doctest と unittest が加わった。序文はこれを今回の変更点に挙げている。
  • 操作と内省を組み合わせた演習。 各章の演習は「仮想アシスタントに質問する」という項目から始まり、アシスタントの答えを確かめる態度を示す。以降の演習は、抽象的なドリルではなく、単語パズル、テキスト生成、重複ファイルの探索、カードゲームである。
  • 無料で、そのまま実行できる。 本文はクリエイティブ・コモンズのライセンスで公開され、ノートブックは何もインストールせずブラウザで動く。

短所

  • 範囲が意図的に狭い。 著者は言語全体を扱わないと述べており、アルゴリズム解析の体系的な扱い、標準ライブラリの幅広い紹介、大きなプロジェクトはない。
  • ノートブック環境と仮想アシスタントへの依存。 この版は Jupyter と仮想アシスタントを軸に作られているため、テキストエディタとターミナルを好む読者は手順を読み替える必要がある。
  • 経験者には出だしが遅い。 序文は、Python の経験が豊富な読者には最初の数章が遅すぎるかもしれないと述べている。
  • オブジェクト指向が段階的に導入される。 最初のオブジェクト指向の章は、あえて慣用的でない書き方を示すため、第15章で通常の形が示されるまで遠回りに感じられることがある。

コースにおける位置づけ

入門プログラミングのコースの中で、本書は用語、デバッグ、問題解決に同じ重みを置いた、コンパクトな Python の最初の一冊である。最も近い代替は Python Crash Course で、ゲーム、データの可視化、Web アプリケーションといったより大きなプロジェクトに進むのに対し、Think Python は小さなプログラムと、その背後にある用語や習慣にとどまる。How to Design Programs と Structure and Interpretation of Computer Programs は、設計手順や Scheme 系の言語という別の伝統でプログラミングを教えており、特定の言語の本よりも強い概念的な基礎を求める読者に向く。

Guttag の Introduction to Computation and Programming Using Python は、計算モデリングやデータ分析を含めてより広い範囲を扱い、Think Python の次に読む本として自然である。The C Programming Language は役割が異なり、最初の言語に慣れた後で、メモリと型を短く低水準の視点から見せる。

本書の使い方

本書は、プログラミングが初めての人にも、他の言語を知っていて Python を学びたい人にも向いている。前提知識は不要である。各章は前の章に依存しており、序文は順番に読み、先に進む前に演習を解くよう求めている。

実用的な進め方は次のとおり。まず基礎となる第1〜6章(算術、関数、条件分岐と再帰)を読む。次に、日常的な Python の中心である第7〜13章(文字列、コレクション、ファイル)に進む。第14〜17章のオブジェクト指向は第二段階として扱えばよく、スクリプト作成が主な目的の読者は第14章を読んだ後は流し読みでもよい。第18章は、前の章を読んでもっと短く書きたくなったときに読むのがよく、第19章は次の一歩を示す短いリストである。

各章を Colab で実行し、例を読むだけでなく自分で入力し、「デバッグ」の節を含む演習を解く。本書の勧めに従ってアシスタントにヒントを求める場合は、出力されたコードをテストし、章自身のやり方と比較する。

版と出典

この導読は、著者がクリエイティブ・コモンズ・ライセンスの下で https://allendowney.github.io/ThinkPython/ に公開している無料のオンライン版、第3版(2024年)に基づく。序文、第1〜18章の全目次と全節見出し、各章の導入、演習と最終章を踏まえている。