一言で言うと極めてポンコツな本と言った印象だ。
初め、タイトルを聞いた時、
「高校数学をネタにして数値計算をPythonでゴリゴリ書くのかな?」
と思ったが、さにあらず。何だか良く分からない本、と言った印象だ。
一体何をしたかったのか。
そもそも想定読者が誰なのか、サッパリ分からん・・・・・・この本、全く「Python入門」的なモノにページが割かれてないんだ。
では、この本で記述されている「コード」をプロのプログラマが書けないとでも言うのか。
さにあらず。
むしろ「文系プログラマで高校数学が怪しい」人でも書けるようなスクリプトで溢れてる。
いや、んなモン文系プログラマでも毎日やってる事だろ(笑)。
かと言って「Pythonの入門」にページが割かれてない以上、Python初学者向き、って事はあり得ない。
ホンマ、一体誰向けに書いたんだ?って問い詰めたいトコだ。
出版社は日経BP。日本経済新聞社関連の出版社で、BPはビジネス・パブリケーションの略、との事。つまり、実はビジネス関連書籍の出版社だ。言っちゃえば特に「技術書出版」のノウハウがあるわけじゃない。技術書で言うと知名度ゼロ、に限りなく近い出版社なんだけど、昨今どういうわけか、「ビジネスで役立つ」Microsoft WordやMicrosoft Excelのノウハウ本に飽きてきたのか(笑)、Python関連の本を数冊出版しはじめている。やめときゃいいのに(苦笑)。
キミら、何だかんだ言ってノウハウないじゃん。
だからこういうアホな本の出版を許すんだよ。
んでまぁ、結論から言うと、この著者は実はあんまPythonを知らんと思う。どっちかっつーとC言語ユーザーだろうな。いっつも腐してるC言語脳だ。
C言語脳、って事はC言語のエキスパートなわけでもなく、っつー事は、会社?メディックエンジニアリングっつーのがどういう業務をやってる会社か知らんけど、恐らくハッカーが一人もいねぇ会社だろうな、って想像が付く。ハッカーが一人でもいたら「こんな本を出させるのを止める筈だ」(笑)。多分社員どれ見てもどんぐりの背比べ状態なんだろう。
驚く事に、この本で「マトモにプログラムを」辛うじて書くのは最初の二章とちょっと、だけなんだ。しかも、もっと具体的に言うと、せいぜい最初の「位取り記数法」、つまり、十進数を二進数に変換したり、十六進数に変換したり、って程度だ。その他はぶっちゃけ、ビット演算の話をしたりして、そもそもそれらは高校数学でもない。全然高校数学と関係ないトピックなんだ。
このテの発想が、恐らく著者が「C言語使いだ」って予想している根拠の一つだ。・・・Pythonでビット演算を細かくやる必要があるの?まず。
つまり、言外に「あたしはC言語を知ってるからこういう知識もあるのよ♥」と無駄なトリビアを語ってるだけ、って気がする。
他には、「ビットをフラグとして利用する」なんてネタもある。
いや、話自体は面白い。この本に載せなきゃ良かっただけ、の話だ。
つまり二進数のビット列xxxxの一ビット一ビットに「フラグとして意味を持たせよう」って事だ。
例えば先頭のビットにはキャンディの保持、2ビット目は宝石の保持、3ビット目は剣の保持、4ビット目には金貨の保持、と。
それで1010は何になるでしょうか、とか(これは剣とキャンディを持ってる、って事になる)。
いや、確かに面白い話ではある。・・・・・・で?
そんなん、ファミコン/スーファミ時代のROMカセット用プログラミング法だろ(笑)。一体、2024年現在の何に役立つんだ(笑)。あんたは80年代からタイムスリップでもしてきたんかい。
読者がこんなプログラムを書こうとしたら、まず100%周りから「止めなさい」って言われる話だ。どう考えても「何ビット目がアイテム✗✗で・・・」とか覚えておくのが無駄だから、だよ。
Pythonだったらこう書くだろ、常識的に考えて。
class inventory(object):
def __init__(self, coin, sword, gem, candy):
self.coin = coin
self.sword = sword
self.gem = gem
self.candy = candy
Cだってそうじゃないのかい?
#include <stdbool.h>
typedef struct inventory {
bool coin;
bool sword;
bool gem;
bool candy;
} inventory_t;
間違いなく、クラスや構造体を作って、ブール値を代入して管理するわ。
何故なら、その方がプログラムする側に分かりやすいから、だ。
敢えてのビット列を使って「分かりづらいプログラムにする」なんつーのは今どきご法度だろ。
つまり、ここで掲げられた話はまさしくトリビアであり、2024年現在では全く役に立たない話、なんだ。
一体何でこの話をぶっこんだのか。知識自慢なのか。そもそも高校数学でさえない。
大体、だな。
太郎くんのキャラクターが持っているアイテムを表すときにtaro_coin = True <- 金貨: 持っているtaro_sword = False <- 剣: 持っていないtaro_gem = False <= 宝石: 持っていないtaro_candy = True <= キャンディ: 持っていないのように、アイテムごとに管理しようとすると変数が4つ必要です。もしも同じゲームに花子さんが参加したら、花子さん用の変数も4つ必要になります。この調子で参加者分の変数を用意していったら、とてもではありませんが管理しきれませんね。
これ読んだ時、バカにしてんのか?とか思ったわ(笑)。
いや、最初から上に書いた通り、クラスか構造体を使う、って手段をすぐ選ぶだろ(笑)?
おかしいな。この本のタイトルには「文系プログラマーのための」って書いてあんだろ。
いくら文系出身だろうと、「プログラミング作法」的には即刻クラスなり構造体なり使う、って思い浮かぶだろ。
それとも何か?「文系プログラマ」って何年経とうがど素人みてぇな事やってんの?
さすがに、まさか、って思いてぇわ(笑)。さすがにんなバカなヤツいねぇだろ。
それともメディックエンジニアリングの社員ってそういうレベルなのかい?
大体仮に、そんな変数を4つも書いてるようなヤツがいて、「ビット列を使えば・・・」ってサジェスチョンもどう考えても変だろ、っての。間違いなく「構造体使えよ」とか「クラス使えよ」って言っちゃうよ(笑)。俺ならそうだよな。絶対言う。でも「ビット列」は言わねぇわ(笑)。んなバカな(笑)。
まぁ、からかうのもいい加減止めておくけど、要はやっぱり想定読者層が何だか良く分かってない、ってのがこうなってる原因なんだよ。プログラマ向けの本じゃないだろ、これ。何だか良く分からん層に向けて書いてる、って事なんだ。
でも初心者向けではない。何故なら全く「Python入門」的な事が書かれてないから。
一体何だこの本は、ってだからなるわけ。いずれにせよ、プログラマ向けを少しでも意図してる、ってぇのならバカにし過ぎだ。そういう奢りが透けて見えてる(そもそもプログラマならビットでフラグ・・・なんつーのは「知識として」既に持ってるだろ)。
実数誤差、なんつーのもどーでもいい。ぶっちゃけ分数使えよ、としか思わん(笑)。Pythonには分数があるが、C言語にはない。それだけの話だ。仮に「実数誤差を理解しなければプログラムは書けない」とか言うのなら、それはC言語でやるべき話なんだよ。
だとすれば、そもそもPythonを使おう、ってのが間違いなんだ。
この辺まとめて、ハッキリ言うけどコンセプトに揺らぎがある。
そして提示されてるコードがクソだ(笑)。
例えばy = 3x-24のグラフを書くコードがこんな風にして紹介されている。
import matplotlib.pyplot as plt
# データ
x = list(range(1, 11)) # xの値(1〜10)
y = []
for i in range(10):
y.append(3 * x[i] -24) # y = 3x - 24
# グラフ
plt.plot(x, y)
plt.grid(color='0.8')
plt.show()
ダッセぇ(苦笑)。こんなクッソダセェコード書いてんじゃねぇよ(苦笑)。
yに空リストを設定して、appendで値を追加だぁ?アホか。
明らかにC言語脳のコードだ。データの破壊的変更に躊躇してねぇ。
Pythonでは正しくはこう書くべきだ。
import matplotlib.pyplot as plt
# データ
x = list(range(1, 11)) # xの値(1〜10)
y = [3 * i - 24 for i in x] # リスト内包表記を使う局面
# グラフ
plt.plot(x, y)
plt.grid(color='0.8')
plt.show()
これで済む。
そもそも、何故にrange(10)やねん。yがxの関数、って前提なら、直接yの計算にはxを使うべき、なんだよ。
仮にリスト内包表記が苦手でも、こう書かれてたらまだマシで、ここまで怒ってはいなかった(笑)。
import matplotlib.pyplot as plt
# データ
x = list(range(1, 11)) # xの値(1〜10)
y = []
for i in x: # こっちの方が「関数」として x と y の関連性がハッキリする
y.append(3 * i - 24)
# グラフ
plt.plot(x, y)
plt.grid(color='0.8')
plt.show()
望ましくはないけど、同書に書かれてるコードよかよほどマシだ。
っつーか、「ループを回す」って発想になった時点で「rangeを何が何でも使わないと」ってなんのがC言語脳の特徴なんだ。つまりPythonと言うプログラミング言語を良く知らずに使った本を書いてる、って意味になる。
大体、最初にyとxに関連性がある、って分かってそこから思考を始めるのは、高校数学以前の中学数学の話だわ。
それってプログラミング以前の基本だろ?
いずれにせよ、この後からNumpyやScipyを導入して、「電卓として」Pythonを使うだけ、の話が殆ど、となる・・・いや、この本、ハッキリ言うとPythonの存在が蛇足以外の何物でもねぇのな。
不思議な事に、「数学の説明」だけは割にしっかり書いてんだ・・・高校数学網羅してるわけじゃないし、ハッキリ言って、「高校数学範疇外の筈の」ベクトルの外積、なんつーネタさえあるわけだが。いや、今の高校だとやってんの?僕の時代だと、「物理の計算で外積使ったら」怒られた印象しかなかったんだが(笑)。
ただ、ニュアンスとしては、「ベクトルの外積」を導入したのは、あくまでNumpyにその機能があったから、程度にしか思えねぇんだよな。
いや、ある意味タイトル詐欺でさ。仮に「Numpy/Scipyで学び直す高校数学」だったらんなに怒ってなかったかもしんない。そういう本が一冊くらいあってもいいかも、程度には考えたかも。でも違うんだ。どう考えても色気だろ?Python本、って事にすれば売れるだろうから、とかさ。
そしてどっちにせよPythonは蛇足になってんだよ。単に「高校数学を学び直す本」でプログラムなんて無かった方が良かっただろ、ってクオリティなんだわ。プログラム外して書いた方が良書、って単純に言えたかも。「Python本としてはサイテーだ」ってプログラムを見るとどうしても思っちゃうんだよな。高校数学を学び直すにしてはプログラムがしょぼい。こんなんで一体何をもって「学習の実感」が沸くんだろうか。単に「人力で計算する」練習問題付けてた方が良かったんじゃないか?
断っておくけど、僕は、「数学をプログラミングで学び直す」事自体は賛成なの。でもだったら「キチンとした数値計算を」扱うべきで、仮にNumpyやScipy使えばそれさえ避けれる、なんて考えてるんなら、言わせてもらおう、とんだ女の浅はかさ、だ。
あるいは「日経BP」なんでテクニカルな話はちょっと・・・とか言うんならそもそもこんな本を出版すんな(笑)。あるいは、もっとマトモな出版社に原稿を持っていくべきだ。
そして、ザーッとプログラムを見たカンジ、そもそもPythonである必要性がねぇのな。NumpyやScipyである必要性さえない。
ぶっちゃけ、同様な「高校数学を学び直す」ネタなら、GNU OctaveやMaximaで良かったんじゃねぇの?って事なんだよ。
GNU Octave。PythonのNumpyは商用の、行列演算に(ある意味)特化したソフトウェア、MATLABの機能のクローンを意図してるが、GNU OctaveはMATLABクローンそのものを意図してる。
例えばNumpyでこういう例が挙げられている。
>>> import numpy as np
>>> a = np.array([2, 2])
>>> b = np.array([2, -1])
>>> a + b
array([4, 1])
>>> a - b
array([0, 3])
>>> 2 * a
array([4, 4])
こんなもん、GNU Octaveならもっとシンプルに書ける。
>> a = [2, 2]
a =
2 2
>> b = [2, -1]
b =
2 -1
>> a + b
ans =
4 1
>> a - b
ans =
0 3
>> 2 * a
ans =
4 4
>>
そもそも記述の簡易さ、で(ほぼ)行列演算専用のGNU Octaveに比べると、何ともPythonの記述は「ゴチャゴチャしてる」。
他にもsympyなんかの導入があって、シンボルが使えないPythonで方程式を解かせよう、なんつー事をやってるんだが、単純にこの目的では、「記号処理ソフト」のMaximaに敵わないだろう。
Maxima。以前にもチラッと紹介したが、Lispによる古典的人工知能研究の集大成だ。電卓には不可能な「方程式を解く」機能があり、これがタダで使える、と言うのは非常にありがたい話だ。このテのソフトは商用でもあるが、大体、100万円とか、ベラボウに高い値段になっている。数学が苦手だ、と言う人ほど使うべきソフトだ。また、理学/工学系の人でも「電卓+α」として愛用者が多い。
例えば、この本だと方程式を次のようにして解いている。
>>> k = Symbol('k')
>>> t = Symbol('t')
>>> ex1 = 4*k - 4*t
>>> ex2 = -6*k -2*t + 4
>>> solve((ex1, ex2))
{k: 1/2, t: 1/2}
こんなモン、maximaなら一発でこうだ。
プルダウンメニューから「連立一次方程式を解く」を選んでGUIで解きたい方程式と変数を設定して終了、だ。
「プログラムらしきモノを書く」必要性さえない。
ホント、提示されたプログラム程度だったら、「GNU Octaveで学び直す高校数学」とか「Maximaで学び直す高校数学」の方がマシだったんじゃないか。
でもアレでしょ?「Pythonはメジャーだけど、GNU OctaveやMaximaは知名度が低いし・・・」とかだろ(笑)?所詮色気を出した、って話なわけじゃん。
「私、Pythonは分かるけどGNU OctaveやMaximaは知らないし・・・」とか言うかもしんないが。でも提示されたコードを見る限り大丈夫、キミはPythonも分かってない(笑)。五十歩百歩だ、目糞鼻糞だ(笑)。誤差の範囲だ(笑)。
一夜漬けでGNU OctaveやMaxima覚えて本を書いても、大したコード上の差は生まれない(笑)。それくらいPythonとしては質の悪いコード、っつってんだよ(笑・※2)。
大体、テーマに合わせて適したツールを選ぶ、って以上にプログラマの才能、ってあるんか・・・?
あ、ごめん、間違った。今のナシ。
良く考えてみたら、一般のプログラマって皆が使ってるからそのツールを使うとか、会社で要求されるからそのツールを使う、とか、自分で何か判断出来ない人種だったわ。忘れてた(笑)。
そうだな、Python人気でNumpyやScipyも人気だから大して物事を考えずに書いた本だな。悪かった、俺が間違ってたわ(笑)。
あー、ホンマ、最近日本で出版されたPython本はクソ本ばっかだ、って知ってたのにも関わらず買っちゃって、当然この本もそういう類の一つだったわけだが・・・。久々に「Python本購入」して「やっぱダメだったか・・・・・・」ってぇんでショックが大きい(笑)。そして、このクオリティで出版を許す、ってぇのなら日経BPって出版社はダメだ。信用が置けない。少なくとも「技術書を出す」技量がない。
悪い事は言わん。もし、「数学をやり直したい」のなら、多分大学初年度で使われてるような「数値計算」の本を購入してやってみた方がいいと思う。たとえC言語を使っていてもそっちの方がマシだろう。
例えばザーッと検索してみると、東京大学でこのようなページが見つかった。読んだこたぁねぇけど(今知ったし・笑)、初学者向けで推薦されてるなら、多分こっちの本の方が良いんじゃないか。
MATLABは上の方でも言及したが、商用ソフトウェアだ。一方、併記されてるScilabはフリーソフトウェアだ。ハッキリ言っちゃえば上で紹介したGNU Octaveのある意味ライバルだ。
Scilab。フランス製のフリーソフトウェアで、MATLABクローンとしてはGNU Octaveとタイを張る。
Scilabで記述されてるのなら、上記の本は充分使える本だろう。
ここで、Scilabなんて聞いた事がないし不安だ、って感じる人もいるだろうが、大丈夫だ。そもそも「数値計算」ってのは原則、方法論としては言語を問わない。「NumpyやScipyでやりました」って方が全然応用が効かんのだ。それは「Pythonでしか通用しない」って事だからな。
また、C言語より遥かに簡単だ。Python程度には簡単だと思う。
しかし、ここで「汎用的にはどーなのよ」って言う人もいるだろう。確かにMATLAB/Scilabは汎用性は全くない言語処理系だ。一方、数値計算だとFortranとMATLABがデファクトスタンダードってのがあるんだ。そしてMATLABは、適用範囲は違うが(※3)、ライバルのFortranより遥かに易しい。だからこそ、NumpyはMATLABの機能をコピーしたがってるわけ。
そして上の本は、繰り返すが、今知ったばかりで全然読んでないが(笑)、恐らく良書だ。何故なら出版してるのが東京大学出版会だから、だ。その名の通り、ある意味東京大学の下部組織だ。
「ええ、東大の本?難しくない?」とか思うかもしれんけど、大丈夫。ここの本はまずハズレはない。
と言うのも、「東京大学」の名を冠する以上、下手な本を絶対出さないんだ。だからクオリティは爆上げとなり、書いてる内容も念を入れて、微に入り細に入り、丁寧な説明を心がける本ばっか、になる。そこには日本の学問のスタンダードは東京大学だ、と言う自負があるんだろ。
加えると、編集がやっぱ優秀なんだよ。教授陣の言うままにならない(笑)。多分原稿突き返しで「書き直し!」とかやってんじゃなかろうか(笑)。そうなの、「東京大学」の名を冠する以上、マジで下手な本出せない、ってカンジで、他の出版社と段違いのクオリティなんだよ。岩波書店なんかとは大違いだ(※4)。当然日経BPとも大違いだ。
あと、ヴァーチャルで東大生になった気になる、ってのもいいじゃない(笑)。
多分、そういうカンジで、実際の大学1年辺りの講義で使われてる数値計算の本・・・上の書籍に限らず、を入手してやってみた方が遥かにマシだと思う(※5)。
とにかく、「文系プログラマのためのPythonで学び直す高校数学」と言う本はダメだ。練習問題が無い数学の本、なんつーのは役に立たず、かと言ってPython本としてはサイテーの部類だ。
繰り返すが、「面倒くさそう」と思っても、数値計算の入門本でも古本で入手して、それでプログラミングにトライした方が遥かにマシな結果を「得る」事が出来るだろう。
以上。
※1: それらの関数に変数を与えてるだけ・・・要は電卓代わりなだけ、だ。プログラムって程じゃない。
言い換えると、関数電卓一個あればどうにでもなる範疇であって、プログラムでも何でもない。
※2: 例えば本の最後の方に、y = xがx軸と成す(0 ≦ x ≦ 10での)面積を、いわゆる区分求積法で求めるプログラムが載ってる。
こういうアホなプログラムだ。
def calc_area(dx):
h = 0 # 棒の高さ
area = 0 # 面積
cnt = int(10 / dx) # 棒の数
for i in range(1, cnt+1):
h = i * dx # 高さを求める
s = h * dx # 棒の面積を求める
area += s # 棒の面積を積算する
return area
このスタイルは、いわゆるC言語のプログラムであって、Pythonのプログラムじゃない。
Pythonで書くならこう書くべきだろう。
def calc_area(dx):
return sum([i * dx ** 2 for i in range(1, int(10 / dx) + 1)])
たった二行で書けるモンを九行も掛けて書くモンじゃない。
行数が多い方がいい、ってぇのならそれこそアセンブリを使うべきで、高級言語を使う意味がないんだ。
原則、コード量が短い方が正義だ。そして、「C言語のように書きたいのなら」C言語を使うべきだろう。
また、本来なら、ここでは書かないが、積分なんかはPythonでは高階関数を使って実装すべきだ。
※3: エンジニアリングでは音響関係なんかはMATLABの独断場らしい。汎用言語処理系ではないが、凄いピーキーな分野では絶大な人気を誇っている。
※4: ここは逆に、噂では(給与が高い割には)編集が仕事をしない、で有名。出版社としては有名ではあるが、ここが出してる本は、大学の先生の同人誌、ってのが実態に近く、結果マトモな編集を通ってないんで、「分かりづらい」とか「難解な」本ばっか出てる始末になってる。
編集者が書き手の言いなりになってちゃダメなんだって。
※5: 今時の大学、なんつーのは、欧米の大学のマネをして、シラバス(授業計画)なんぞは公開している。つまり、ある授業に於いて、どういう講義計画があり、またどういった教科書を使用するのか、なんぞは、大体のトコ、大学部外者にも「丸わかり」になっている。
結果として、気になる大学、例えば自分の出身大学であるとか、あるいは地元の有名な大学、大阪なら阪大、京都なら京大、東北地方なら東北大、北海道なら北大、とかその辺でどういう教科書を利用してるのか、なんつーのも「丸わかり」なんだ。
そういうトコで使ってる教科書は「何故にその教科書を使うのか」大体のトコしっかりとした「理由」がある筈なんだ。分かりやすいから、とか網羅の度合いが違う、とかな。
いずれにせよ、自分の母校や各地方の有名大学とか、そういうトコのシラバスを「大学1年次」「数値計算」辺りでキーワードを絞って見れば、「どういう教科書が使われてるのか」大体のトコが分かる筈だ。
また、「授業計画」が出てる、って事はその教科書の「どこ」を重点的にやるのか、まで書いてる確率が高い。何故なら定期試験があるから、だな。結果「どこを重点的に読め」、つまり一番重要な事柄がどこに書いてるのか、の把握も可能となる。
大学のシラバス、ってのは言い換えると、特定の教科書に於いて、「自習者」に対してもその本の「読み方」を間接的に指導している、って事になる。これは数値計算に限らず、一般的な「プログラミング」に対しても使える「検索テクニック」だと言う事だ。
んで、加えて言うと、大学傍ってのは「古本屋」ってのが多いケースがある。「キチンと学生が勉強してる」って前提だが。
どういう事か、っつーと、貧乏学生はこの時代にも当然いて、指定教科書をそういう大学傍の古本屋から買ってきて、講義が終わったら売っぱらう、って事を良くやってんだよ(笑)。「勉強してる」学生が多い「良い大学であればあるほど」近所の古本屋が繁盛する、って構図になっている(笑)。
従って、そのテの「大学傍の古本屋」では、現役の大学一年生辺りが使う教科書が格安で置いてる筈だ。ある意味狙い目だし、また、「現役の大学一年生」が実際使って学んでる本を入手出来る、って意味でもある。これで貴方も(その大学の)ヴァーチャル大学一年生だ(笑)!