David Kopec:Python 計算機科学新教本

いろいろ難しい Python

作成日:2021-05-02
最終更新日:

概要

原題は "Classic Computer Science Problems in Python"。 本書の情報は下記オライリー・ジャパンのページにある:
https://www.oreilly.co.jp/books/9784873118819/
原書の内容は下記にある:
https://www.manning.com/books/classic-computer-science-problems-in-python
下記からも多くの情報をたどれる:
http://clasicproblems.com

感想

本書は、私には難しい。

収束計算

p.17 では円周率 π の計算にライプニッツの公式を用いている。

`pi = 4/1 - 4/3 + 4/5 - 4/7 + 4/9 - 4/11 cdots`

この式で 100 万項を加えている。その結果は本書にはないが、私の結果は次の通り。
3.1415916535897743

小数点以下6ケタで真の値と離れている。では 1000 万項を加えたらどうだろうか。同じく結果は次の通り。
3.1415925535897915

小数点以下7ケタで真の値と離れている。

プログラムやアルゴリズムを示すのが目的とはいえ、収束が遅い級数を紹介するのは教育的ではないだろう。

なお、式の表現には MathJax を用いている。

Protocol 型

2章は探索問題を説明している。p.31 で、from typing_extensinos import Protocol ではなく from typing import Protocol を使えるはずです、とある。また訳注で、 訳注で、Protocol 型は Python 3.8 で導入される予定となっている。 私の WSL2 での Python 3.8.5 では、from typing import Protocol で問題なく動作した。

SEND + MORE = MONEY

3章は制約充足問題という表題である。 制約充足問題の解法を学ぶことで、たとえば、SEND + MORE = MONEY という覆面算を解くことができる。 例3-17 に「send_more_money.py」続きとしてコードが書かれていて、次のようにコードを説明している:

文字 M に解の候補を前もっと割り当てていることに気づくはずです。これは M の解の候補に 0 が含まれないようにするためです。

コードはこうなっていた:

possible_digits["M"] = [1] # 0 で始まる解はない

コメントや説明とコードが違う。コメントに従うのならコードはこうなるはずだ。

possible_digits["M"] = [1, 2, 3, 4, 5, 6, 7, 8, 9] # 0 で始まる解はない

コードに従うのなら、説明はこうなるはずだ:

3ケタと4ケタの足し算の結果が5桁になるのならば、その5桁の一番上の位は1しかない。

もちろん、M の候補を 1 から 9 まで広げても、解は1つしかない。ただし、計算時間が余計にかかるし、 美しくない。

それはともかく、抽象基底クラスは役に立つ。
https://docs.python.org/3/library/abc.html
参照。

グラフ問題

4章はグラフ問題を扱っている。p.87 にはグラフの接点(vertice)を登録する例が載っている。 この登録のプログラムを見てげんなりした。タイピングが大変だ。

	(前略)
    city_graph.add_edge_by_vertices("Seattle", "Chicago")
    city_graph.add_edge_by_vertices("Seattle", "San Francisco")
    city_graph.add_edge_by_vertices("San Francisco", "Riverside")
    city_graph.add_edge_by_vertices("San Francisco", "Los Angeles")
    city_graph.add_edge_by_vertices("Los Angeles", "Riverside")
    city_graph.add_edge_by_vertices("Los Angeles", "Phoenix")
    city_graph.add_edge_by_vertices("Riverside", "Phoenix")
	(後略)

こういうとき、add_edge_by_list() というメソッドを作って
city_graph.add_edge_by_list("Sattle", ["Chicago", "San Francisco"])
のように書ければ、2行以上必要なコードが1行ですむので、すっきりする。 実際に書いてみて、動作することを確かめた。

    # 接点のインデックスのリストを使って辺を追加(簡易メソッド)
    def add_edge_by_list(self, first: V, l: List[V]) -> None:
        for second in l:
            self.add_edge_by_vertices(first, second)

誤植

上記オライリー・ジャパンのページには誤植の欄がないが、本書には誤植がある。

p.216 下から9行目、4 - GHJ となっているが、正しくは 4 - GHI である。

書誌情報

書 名Python 計算機科学新教本
著 者David Kopec
訳 者黒川 利明
発行日2019 年 6 月 25 日 初版第1刷
発行所オライリー・ジャパン
発売元オーム社
定 価3000 円(税別)
サイズ
ISBN978-4-87311-881-9
その他越谷市南部図書室で借りて読む
NDC

まりんきょ学問所コンピュータの部屋コンピュータの本Python > David Kopec:Python 計算機科学新教本


MARUYAMA Satosi