いろいろ難しい Python
原題は "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 を用いている。
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 で問題なく動作した。
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 円(税別) |
サイズ | 版 |
ISBN | 978-4-87311-881-9 |
その他 | 越谷市南部図書室で借りて読む |
NDC |
まりんきょ学問所 > コンピュータの部屋 > コンピュータの本 > Python > David Kopec:Python 計算機科学新教本