作者: 機械伯爵
日時: 2005/10/17(08:53)
"http://blog.livedoor.jp/kikwai/"より転載

PはPythonのP
    ---P IS FOR PYTHON---01h

"............
    IT's!"
「はじまるよっ!」

0000-0001.はじめに、『数』ありき



 『ソレ』は、かつて人であった。
 そして今も、人であったときの意識を受け継いでいた。
 すでに『ソレ』の生身の部分は、1%にも満たない。
 あとは全て、人造物に置き換わっていた。
 それでも、『ソレ』は思考しつづけた。
「ニオイ………アタタカイ………エンザンシ?」
 記憶の淵より、泡沫のように浮かんできた『何か』に、
『ソレ』は戸惑った。
 戸惑いながらも、なぜか懐かしい思いにかられ、『ソ
レ』はしばし、その感情に心をゆだねた。

    ☆    ☆    ☆

「それでは、先生、よろしくお願いします」
「あ………え?………う、うん」
 朽縄 巽 (くちなわ たつみ) は、全く落ち着かない
ようで、視線がどこか泳いでいる。
 大鳥翔子 (おおとりしょうこ) は、むすっっとして、
巽の両のほっぺたをつかみ、にゅっ、っと伸ばす。
「んがっ?」
「ちょっと、なにそわそわしてんのよ。なんか後ろめた
いことでもあるの?」
「いやその………」
 ここは、翔子の部屋である。
 物理的には、世界中で一番落ち着ける場所である隣の
家の自分の部屋から、十メートルくらいしか離れていな
い。
 しかし、そこは別世界だった。
 なぜか幼なじみの翔子にプログラミングを教える羽目
になった巽は、当然のことのように自分の部屋で教える
つもりだった。
 なんといっても機材も資料も豊富にあるし、巽にとっ
ても一番落ち着ける場所だったからだ。
 さらに言えば、翔子もちょくちょく訪れている場所で
あり、何の問題もないと考えていた。
 ところが、その当然の考えは、翔子によって一蹴され
た。
「教えてもらうの、今日からでいいよね」
 学業を終え、生徒会の仕事を終え、一緒に帰途につく
巽に、翔子は言った。
 今までは、帰宅部役職無しの生活を送っていた巽と、
生徒会役員の翔子が一緒に帰ることは無かったのだが、
今期より役員に引きずりこまれた巽の帰宅時間は、当然
翔子と同じになったというわけだ。
 で、帰る方向は元から同じということで、ほぼ必然的
に毎日一緒に帰ることになった。
「ああ、いいよ」
 十五分という一生の貴重な時間を浪費して悟った巽は、
落ち着いて言った。
「じゃ、夕飯済んだら、あたしの部屋に来てね」
「……………」
「……………」
「……………」
「……………ちょっと、なに? その、ぬらりひょんに
言い寄られたような顔は?」
 どういう顔だ、それは?
「い、いや、その………なぜ翔子の部屋に僕が行かなき
ゃならないのか、ってのが、わかんないんだけど?」
「? なに寝ぼけてるの? あたしにプログラミング教
えてくれる約束、忘れたの?」
「忘れてないよ。でもそれが、どうして翔子の部屋に行
く、ってことにつながるの? って聞いてるんだけど」
「なんでわかんないの? あたしの部屋で、あんたがあ
たしを教えるからに、決まってるじゃないの」
 ………理解するまで、約三十二秒経過。
「いや、僕はこっちに翔子がくるとばっかり………」
「ヤよ。あんたの部屋であんたの講義なんて長々聞いて
たら、あたしの頭が汚染されるわ」
「……………」
「……………」
「……………で、でも、翔子は僕のとこよく来るけど、
僕は翔子の部屋、小学校の時以来、行ったこと無いんだ
けど………」
「当たり前でしょ。なんであたしが、あんたを部屋に入
れなきゃならないのよ。理由が無いわ」
 自分は用が無くても来るくせに、と思いながらも、反
論しない程度の知恵はつけた巽。
「だったら普通、僕んとこでやると思うじゃないか」
「理由が無いから呼ばなかったのよ。今日は理由がある
わ」
「……………」
「別に、あたしの部屋にもパソコンあるんだし、光でつ
なぎっぱなし環境になってるし、それでも問題あるの?」
 光通信………
 まだADSL環境の巽は、ほんのちょっと羨ましかった。
「いや、無い、けど………」
「だったら、なにダダこねてるのよ」
「そ、そっちで教えるとなると、荷物とか、持ってくこ
とになるから」
「別にいいでしょ、隣なんだから」
「……………」
 こういう場合、翔子が譲ったことは一度も無いので、
巽はしぶしぶ受け入れることにした。
 実は翔子が来ることを想定して、講義用の環境を数時
間かけて完備したなどと言っても無駄だろう。
 もっともその時間の殆どは、掃除と整理によるスペー
ス確保に当てられた。
 その結果、巽の部屋は、以前と比較すれば妙に綺麗に
なっていたのだが。
「あんたの言うとおり、事前に出された宿題もこなした
んだから、ちゃんと使える環境にはなってる筈よ」
「ま、それならいいか」
 考えてみれば、一から教えるなら、その環境に立ち会
って使えるようにしておき、自分で何度も試せるように
しておいたほうが良いだろう。
 そう考えて、巽は納得した。
 自分の部屋の掃除のきっかけにもなったことだし、と。
 しかし、彼は甘かった。

    ☆    ☆    ☆

 『教えられる側』にとっては最高の環境でも、『教え
る側』にとっては良くない環境もある。
 しかもそれが、教える内容に『全く関係ない』場合、
抗議すらも出来ない。
 巽を襲った予想外の脅威とは………『匂い』であった。
 個人部屋というものは、どうしてもその人の匂いがつ
く。
 特に、その部屋にベッドがあり寝起きする場合など、
かなり強烈な匂いがしみつく。
 ところがタチの悪いことに、その部屋で普段生活して
いる本人は、全く自覚していなかったりする。
 よって、巽の居心地の悪さは、翔子には全然判らない。
 さらに、自分はちょくちょく巽の部屋に行っているの
で、余計にその気持ちが理解出来ないのだった。
 巽は予想外のことに動揺しながらも、深呼吸し………
結果、その『匂い』を肺一杯に吸い込んで、さらに悪化
したが………必死で自分を落ち着かせながら、話をなん
とか始めた。
「と、ともかく始めよう。課題として渡したことは、出
来てるんだよね。ちょっと確かめさせてもらうよ」
「どうぞどうぞ」
 翔子のパソコンはオール・イン・ワンタイプのラップ
トップで、机の一部を占有している。
 OSはWindwos Xp Home Edition。
 すでに起動してデスクトップ画面が表示されていたの
で、巽はキーボードのメニューボタンを押してスタート
メニューを開き、『アクセサリ』から『コマンドプロン
プト』を選択する。
 ここで、コンソールに"python"とタイプする。

  C:\Documents and Settings\shoko>python
  Python 2.3.5 (#62, Feb  8 2005, 16:23:02) [MSC
  v.1200 32 bit (Intel)] on win32
  Type "help", "copyright", "credits" or "license
  " for more information.
  >>>

「上出来、上出来」
 想定通りの結果に、巽は頷く。
「苦労したわよ。特に環境変数の設定とか、わかんなか
ったし」
 巽の渡した『事前課題』は以下のとおり。

・Python-2.3.5 をデフォルトフォルダ (インストーラが
  指示したままのフォルダ) にインストールすること
・パスをc:\Python23に通しておくこと

 Windows のシステムでは、カレントディレクトリ(コ
マンドを実行している場所)にあるプログラムか、ある
いはパスが通してある(環境変数に登録してある)場所
のプログラムが実行可能となる。
 『フルパス指定』という、ディバイスからプログラム
実行ファイルまでのディレクトリ経路 (パス) を全て記
述する方法なら、パスを登録する必要は無い。
 たとえば上の例なら、こうすればよい。

  > c:\Python23\python

 これは「C ドライブの Python23 フォルダの
python(python.exe など) を実行せよ」という意味にな
る。
 ただ、何度も使うプログラムにいちいちフルパス指定
していたら面倒なので、通常そういう場合はパスを設定
する。
 パスの設定は、Windows 9x 系 (Windows 95,Windows
98,Windows Me) の場合は autoexe.bat というファイル
の末尾に

  "path=%path%;c:\Python32;"

 などと書いておけばよいが、Windows NT 系 (Windows
NT,Windows 2000,Windows Xp) では、『マイコンピュー
タ』アイコンを右クリックして、『プロパティ』を選び、
『システムのプロパティ』アプレットを開き、『詳細設
定』タブの下の『環境変数』ボタンを押し、『ユーザ環
境変数(ログオンしているアカウントでのみ使用)』か
『システム環境変数(このコンピュータを使用する全て
のユーザのアカウントに対して有効))』の、どちらか
の PATH を編集し、末尾に";c:\Python23"を加える。
「コマンドプロンプトなんて、今まで触ったこと無いん
だけど………それ、危なくない?」
 翔子の必要以上に警戒するに、巽は苦笑する。
 システムエンジニアである父親の手ほどきで、小学生
のころからコマンドプロンプトのようなターミナルを叩
いていた巽には、コンピュータといえばこちらの画面の
方がなじみであった。
「まぁ、怖がるほどのモノでもないけど、慣れないと判
りづらいものかもね。ただ、ファイルなんかを扱う関係
から、最低でも cd, copy, del, dir, ren, type くらい
のコマンドは使えるようにしといたほうがいいかもしれ
ないね」
 コマンドに関しては /? オプションをつけて実行する
と説明文が出る。
 たとえば、cd なら、

  > cd /?

 とタイプして実行(Enterキーを押す)すればよい。

※なお蛇足ながら、初心者の場合、以上の操作は全て、
  及びこれからの作業は、「日本語モード・オフ (半角
  英数字モード)」の状態で行うこと。

 起動を確認した後、巽は Python を終了させ、exit コ
マンドを入れてコマンドプロンプトを閉じた。
「じゃ、Pythonの起動のところからやってみて」
「Pythonの起動?」
「うん、僕が今やった通り」
 翔子がじろりと巽を睨む。
「同じことやるんなら、今のウィンドウ、開いとけば良
かったのに」
 巽は首を振る。
「ダメだよ。自分でやらないと覚えないから」
 翔子は、『巽のくせに態度がデカい』とかぶつぶつ言
いながら、おっかなびっくりコマンドプロンプトを立ち
上げて、コマンドを打ち込む。
 翔子も一応ワープロなどは普通に使うので、タッチタ
イピングはできる。
 じきに、先ほどのオープニングメッセージが現れる。
「できたわよ」
「それじゃ、最初に終了の仕方から、覚えとこうか?」
 翔子は露骨にイヤな顔をする。
「まだ何もやってないのに、終わるの?」
「うん。終われないプログラムは危険だからね」
 真理だが、教わる方にとっては理不尽にしか聞こえな
い。
「『閉じる』ボタン押せばいいのに」
「Python は終了しても、プロンプトを引き続き使う場合
は多いから、そういう横着しない」
「わかったわよ。で、どうやるの?」
「『Ctrl』キーを押しながら『Z』キーを押す」
 『Ctrl』+『Z』キーは、ターミナルに EOL のコード
を送る。
 ちなみに、UNIX 系 (Mac OS X を含む) では、『Ctrl』
キーと『D』で終了する。
 また Windows でも、IDLE 環境なら『Ctrl』と『D』で
終了する。
「終了したわよ」
「じゃ、もう一度起動して」
「……………」
「起動して」
「……………」
 翔子は、ぶっす―――っと膨れたまま、乱暴にタイプ
する。
「じゃ、内容に入るよ。1 + 1 ってタイプして
Enter キーを押して」
 '>>>'というマーク(プロンプト、と言う)に続いて、
翔子は'1 + 1'とタイプし、Enter キーを押す。
「2って出たわよ」

  >>> 1 + 1
  2
  >>>

「すごいだろ」
「………凄すぎて涙が出るわ。これ、ただの計算じゃな
い」
「そうだよ」
「………あたし、プログラミングを習いたいんだけど」
 翔子の不満を十分承知のうえで、巽は言う。
「うん。でも、プログラムで何ができるかって、翔子、
知らないだろ?」
「それはそうだけど」
「プログラミングっていうのは、そもそも何が出来るか
を知った上で、その手順を順番に書いていく作業なんだ
よ。だからまず、パソコンに何が出来るかを知っておく
必要があるんだ」
「ふ〜ん、でも、足し算程度なら、電卓叩けば済むわ」
「じゃ、一億一掛ける一億一とか、電卓でできる?」
「そんなの暗算でできるじゃない。一京二億一」
 そーいう話してねーだろっ! と言いたいのをぐっと
こらえて、巽は続ける。
「じゃ、一億二千三百四十五万六千七百八十九掛ける九
億八千七百六十五万四千三百二十一は?」
 傍目に聞くと、ほとんど小学生レベルの言い合いであ
る。
「出来るわけないじゃない。普通の電卓は八桁か十桁な
のに、それ概算で十八桁でしょ?」
「電卓では出来ないよ。けどパソコンならそれくらい軽
く計算するだけの能力はある。とりあえず、そこに打ち
込んでみてよ。掛け算の記号はアスタリスク (*) を使
って」

  >>> 123456789 * 987654321
  warning: integer multiplication
  121932631112635269L
  >>>

「なんか、エラーメッセージ出てるけど………計算はで
きてるわね。でも、数字の末尾のLって何?」
「長整数て言って、桁数の多い整数計算に用いるものな
んだけど、とりあえず気にしなくてもいいよ」
「気になるわよ」
 話が長くなるんだけどなぁ、とつぶやきながらも巽は
説明する。
「通常の桁数の少ない整数とは、計算の際の処理方法が
違うだけだよ。桁数の少ない整数は、高速演算できるよ
うな処理を行うんだ。逆に桁数の多い整数は、演算自体
の精度のために処理速度を犠牲にしてる。ちなみに、最
初っから数値の末尾に L か l をつけとくと、エラーメ
ッセージは出ないよ」
 なお、Python の今後のバージョンでは、長整数という
ことは意識せずとも使えるようになる予定である。
「で、それがなんなの?」
「うん、さっきも言った通り、パソコンに何が出来るか、
を知らないとプログラムは書けない。全部を知っておく
必要は無いけど、ざっと見ておくといいよ」
「関数電卓みたいに、関数が使えるとか?」
 関数電卓は、理工系の学生には必須の品だが、一般的
では無いので少し触れておくと、普通の計算機能の他に、
三角関数などの特殊関数もこなせるようになっている電
卓を指す。
 モノによって性能もかなり異なるが、高性能のものに
なると、計算式を覚えさせたり、簡単なプログラムが書
けるものもある。
「ま、それもあるけど、、とりあえず『演算子』………
四則計算の+−×÷みたいなのね………の一般的なのを
一通り見てみよう。そのうちでもっとも基本的なのは四
則演算子だけど、その中でちょっと注意が必要なのは割
り算なんだよね。15÷2 とかやってみて。割り算の記号
はスラッシュ(/)ね」

  >>> 15 / 2
  7
  >>>

「7? 15÷2なら7.5じゃないの?」
「15.0 / 2 か、15 / 2.0 か、15.0 / 2.0 で、計算して
みて」

  >>> 15.0 / 2
  7.5
  >>>

「今度は出たわ。どういうこと?」
「これはいずれ変更される予定だけど、小数の部分も扱
う『浮動小数点数』と『整数』とが、コンピュータの処
理上ではきっちり分けられていて、整数/整数を指定す
ると、整数で答えが出るように、今のところはなってる
んだ。だから、片方の数値を『浮動小数点数で扱うよ』
っていう宣言をしておかないと、答えが浮動小数点数に
はならないんだ」
「不便ね」
「まぁ、ね。だから変更予定に入ってるんだ。ただ、こ
ういう演算は意外に重宝するから、変更後も"//"ってい
う別の演算子で使えるようになってる。'//'は今でも使
えるから、整数÷整数に、切捨ての整数の答えが欲しい
時は、これを使ったほうがいい」
「でも、四捨五入でもない切捨てって、何に使うの?」
「四捨五入しないほうがいい場合もあるよ。例えば、
『百二十四個のクッキーを一人三個ずつ配るとすると何
人に配れるか』なんて時、端数はあっても関係ないよね。
割り算の使い方の中でも、セットが重要であり、端数は
いくらあっても使えないって時は、切捨て算は便利なん
だよ」
「あっそう」
 巽には、今一ピンとこない翔子の気持ちは理解できる
が、C 言語などになじんで、切り捨て算のほうが自然に
感じる巽の気持ちは、翔子には理解できないだろう。
「それに、コンピュータの浮動小数点数って、いろいろ
問題があるんだよ。たとえば、1.0 / 5 をやってみて。

  >>> 1.0 / 5
  0.20000000000000001
  >>>

「なにこれ?」
「コンピュータの数値は2の整数乗の和でつくってるか
ら、整数はすべて作れるけど、小数点数は必ずしも全て
は作れないんだよ」
「2の整数乗? 2の2乗とか3乗とか?」
「うん。小数だと2のマイナス1乗とかマイナス2乗と
か」
「2のマイナス1乗や2のマイナス2乗って………二分
の一や四分の一のこと?」
「そういうこと」
 巽はこっそりと胸をなでおろす。
 数学が苦手な人は、このあたりの話をすると、拒絶反
応を起こすことがある。
 コンピュータを扱うのに必ずしも計算が得意である必
要は無いが、数を扱うパズルなどが死ぬほどキライとい
う人には、かなりキビしいだろう(そういう人にも使え
ると謳うプログラミング言語もあるらしいが)
 幸い翔子は、数学が特に苦手ということは無かったの
で、話は早かった。
 ちなみに、数学が『少しだけ』苦手の人に補則してお
くと、累乗、つまり二乗とか三乗とかいう数値は、その
数だけ「1に」掛けるという意味である。だから、どん
な数値もゼロ乗は1。そしてマイナスは逆だから、2回
割る、三回割るという感じになる(ちなみに分数乗だと
ルートなんたらになったりするけど、こちらはとりあえ
ず知らなくてもいい)。
「0.2 は五分の一だけど、半分の半分の…と無限に分割
して細かいピースを作っても、きっちり収まるパーツは
無いんだよ。だから、浮動小数点数って、0.2 のような
簡単な数さえ概数なんだ」
 整数の拡張概念から小数を扱う浮動小数点の形式は、
どうしてもこの誤差という問題から逃れられない。
 なお、本当に正確な数値を扱いたい場合は、有理数
(整数に分数を含めたもの)の範囲であれば、分数型を
定義することはできる。
 また、Smalltalk や Lisp 処理系の一部では、有理数
型が組み込まれている言語もある。
「なんか、電卓より面倒じゃない?」
「実は、電卓でも同じことやってるんだけどね。ただ、
こちらはより正確な形を表示してるだけなんだよ。でも、
やっぱりこれじゃ見難いから、今やったみたいな簡略表
示じゃなくて、ちゃんとした表示方法使えば観やすくな
るよ」
「ちゃんとした表示方法ってなによ?」
「print文。僕の言うとおりにタイプして」

  >>> print 1.0 / 5
  0.2
  >>>

「printって入れれば、普通に出るのね」
「うん、もともとこの画面は、Python インタープリタと
か、REPL(read-evaluate-print loop) とか言うんだけど、
自動的に表示されるのは打ち込んだコードが値を持つ
『式 (expression)』であるときだけなんだ。あとで詳し
く話すけど、Python ではプログラムの単位は『文
(statement)』で、式と文は厳密に区別される。print 文
は文だから、表示された値は print 文の値じゃなくって、
『print 文が表示させた』値、ってことになる」
「ややこしいのね」
「print 文は『式を評価 (計算) して表示する』文だか
らね。表示しない文、書いてみればわかるよ。変数 a に
100 という数値を代入する、というような時は、a = 100
と打つんだ」

  >>> a = 100
  >>>

「値が出ないね」
「文には基本的に値は無いからね。C 言語や Perl なん
かは文と式の区別は殆ど無い (式を区切ったものが文)
から、代入も代入文じゃなくて代入式で値もあるんだけ
ど、Python は文扱いだから値は無いんだ」
「どっちがいいの?」
 巽は、ひくっっと頬が引きつるのを感じた。
「良い、悪いがはっきりしてるなら、両方の方式の言語
があるわけないでしょ。これに関してはそれぞれ違う考
え方に基づいてるんだ。式本位のほうが、プログラムの
書き方の自由度が上がる。でも、機械には読めても人間
には読みづらくなることもあるから、あとでコードを直
したりするメンテナンスが難しくなることもある。逆に
文本位だと書き方の自由度は少なくなるからややまどろ
っこしい書き方になることもあるけど、総じて人間にも
読みやすくなる。僕は、入門者/初心者には、色々なコー
ドを読んで欲しいから、読みやすい形式を選んだってと
こ」
 ちなみに、『どっちが良い』という言葉は、プログラ
ミング言語を比較する上では、話がややこしくなるので、
出来るだけ避けたほうが良い。
 言語は考え方であり、一種の宗派でもあるから、言語
論争はさながら宗教論争の様相を呈する(ぶっちゃけて
言えば『泥仕合になる』)ことが往々にしてある。
 よって無難に『好き、嫌い/合う、合わない』で語る
か、あるいは『特徴』を語るに留まると良いだろう。
「さて、折角代入したんだから、これ使って計算してみ
よう」
「もう使えるの?」
「a を数値みたいに使って、足し算とかしてみて確かめ
てみるといいよ」

  >>> a + 23
  123
  >>>

「100、確かに入ってるね」
「変数は、プログラムが終了するか、新しい値をセット
されるまで使えるんだ」
「変数はいくつ使えるの?」
「いくつでも。a だけじゃなくって aa みたいに複数文
字の変数名も使えるからね」
 ちなみに、初期の BASIC では、変数は一文字しか使え
ないものもある。
「ふぅん、それなら少し便利かも。でも、電卓の M+
(メモリープラス)キーって、一個しか覚えられないけ
ど、計算結果を収納できるのよ。それ、出来るの?」
「もちろん」

  >>> b = a * 100
  >>> print b
  10000
  >>>

「じゃ、変数内容の中身に、数値を足したり引いたりす
ることは?」
「電卓では、メモリ内容に加減算しか使えないけど、プ
ログラムなら他にもいろいろできるよ。ただ書き方は同
じだから、とりあえず掛け算で書いてみよう」

  >>> a = a * 2
  >>> print a
  200
  >>> a *= 2
  >>> print a
  400
  >>>

「a イコール a 掛ける 2 って、なんだかややこしいん
だけど」
「代入文は、右辺を評価…計算ってことかな…して、そ
の値を左辺に代入するんだ。だから、右辺では a を用い
た計算をして、その値を a に入れたってことだね。だか
ら左辺の a と右辺の a は別物ということ」
「つまり、イコールの右側を先に計算しちゃって、それ
を左側に入れるっていう、二段階の作業してるわけね」
「そういうことだね。で、アスタリスクイコールは、そ
の略記方ってこと」
「当然、プラスイコール、マイナスイコールってのもア
リなわけね」
「アリだよ、もちろん」
「なんかちょっとわかってきたわ。じゃ、変数 b の値を
変数 a に入れるには、b イコール a でいいわけね」
「今のところはいいよ。変数の中身が数字だからね。た
だ、今は『代入』っていう言葉を使ってるけど、実際に
やってることは若干ニュアンスが違うんだ。また、必要
な時に説明するよ」
「今は教えてくれないの?」
「あんまり意味が無いからね。代入として考えると話が
おかしくなるようなモノがあるんだけど、それ自身の説
明も全然してないしね。まぁ、気長にやろうよ」
「………あたしが短気なの、知ってるでしょ?」
「いいことだね。他の世界はともかく、プログラミング
の世界だけは、短気は『プログラマの三大美徳』の一つ
だよ」
「なによその『プログラマの三大美徳』って?」
「『プログラマの三大美徳は、無精 (Laziness)、短気
(Impatience)、傲慢 (Hubris) である』って、これは有
名な Perl 言語を作った Larry Wall の名言だけど、短
気の話だけでいうなら、コンピュータがちんたら計算し
てるのを気長に待ってるような人間は、プログラマに向
かないってことだよ。計算時間に我慢できずに、プログ
ラムを改良してしまうような人間が優秀なプログラマに
なれる素養があるってこと。そういえば釣りなんかも短
気な人間のほうが向いてるってね。ミミズがふやけるま
で我慢してるような人は向かない。釣れなければ粘らず
に、短気を起こしてとっととポイントを変える人のほう
が良く釣れるってね」
「短気だって言って、誉められたの初めてよ」
「そういう世界なんだよ」
「でも、その三つ…無精、短気、傲慢…をそろえた人間
って、社会不適合者とか言わない?」
 巽は苦笑する。
「言われるよ。だから普通の人とプログラマって、意見
がなかなか合わないんだ」
「機械相手に喋ってばかりいるからでしょ?」
「文化や思想や哲学が違うって方が正しいだろうね。僕
はプログラマの考え方のほうが正しいだなんて言うつも
りは無いけど、それなりに論拠はあるんだよ」
「でも、人間の最低限度の社会常識ってあるじゃない」
「無いよ、そんなの」
 軽く言った翔子の言葉を、巽は意外に強く否定した。
「いや、だってその、ほら、学校だって道徳の時間があ
るわけだし………」
 巽は首を振る。
「価値判断基準が時代によって変化しない普遍的なもの
だなんて、誰が決めたの? 例えば、キリスト教の常識
とイスラム教の常識は同じ? 別にプログラマの考えに
賛成しろとは言わないけど、色々な考え方があることを
認めて欲しい。思想や文化を認めないってことは、排他
主義に繋がるってことだよ」
「そ、そんな大袈裟なことなの?」
「まぁね。プログラミングって単なる技術じゃなくって、
思考方法でもあるんだよ。だから、頭を柔らかくしてお
いてね」
「う、うん」
「あ、脱線しちゃったね。次、行こう。次は四則計算以
外の演算だね」
「四則計算以外って、累乗とか累乗根とか?」
 累乗 (べき乗とも言う) とは、何の何乗とかであり、
累乗根とは二乗根や三乗根(三回掛けるともとの数値に
なるもの)のことである。
 なお、さりげなく代入についての話題を回避したこと
には、翔子は気付いていないようだった。
「累乗は、Python の場合は単にアスタリスクを二つ続け
て書くだけだよ。

  >>> 5 ** 3
  125
  >>>

累乗根は、累乗のとこに分数を書けばいいから、例えば
の三乗根なら、

  >> 27 ** (1.0 / 3)
  3.0
  >>>

って感じで、できるよ」
「じゃ、三角関数?」
「それはまとめて関数の使い方で教えるよ。今からやる
のは比較演算。100>(大なり)50 って、打ってみて」

  >>> 100 > 50
  True
  >>>

「"True"って出たけど?」
「うん。真偽判定だよね。今回は 100 のほうが 50 より
大きいから、『真』ということで、"True"」
 念のため、Trueは英語で『真』を表す単語である。
「じゃ、逆にすると?」
「打ってみれば? 疑問がわいたら即タイプ、だよ」
「うん」

  >>> 100 < 50
  False
  >>>

「"False"で『偽』ね」
「比較演算子はあと3種類あって、以上を意味する≧
(大なりイコール)は、>と=を続けて打つんだ。同じ
く≦(小なりイコール)は <=。で、イコールはイコール
を二つ続けて打つ」

  >  大なり
  <  小なり
  >= 大なりイコール
  <= 小なりイコール
  == イコール
  != ノットイコール(イコールではない)

「大なりイコールとかはともかく、イコールはどうして
二つ書くの?」
「だってイコール一個は、代入だもん」
「あ、そうか」
「他の言語、例えば Pascal とか Smalltalk なんかは、
代入を『:=』 (コロンイコール) や『←』を使って、等
号にイコールを使ってることもあるけど、代入をイコー
ルで書くのは、昔々の FORTRAN からの伝統だから、この
方式を利用してる言語も多い。まぁ、比較演算子として
の等号に == を使うのは、C言語式だけどね (FORTRAN
は『.EQ.』)」
「『ふぉーとらん』って、もしかして、アポロを飛ばし
たプログラミング言語?」
「よく知ってるね」
「大昔のゲーム機の初代ファミコン以下の性能のコンピ
ュータで月ロケットを飛ばしたって話の時に、確か聞い
たから」
「アポロ計画以来、人類が月に行ってないことを考える
と、すごい話だよね。ま、それはさておき、比較演算子
の話だけど、比較演算子の左右には、数値だけじゃなく
て当然式も書ける」

  >>> 1 + 2 + 3 < 4 + 5 + 6
  True
  >>>

「で、変数も使えるのね」
「よくできました。比較対象として変数や変数を入れた
式も使えるし、結果を変数にも入れられる」
「結果を入れるって?」
「素直にイコールを使うんだよ。True や False も数値
みたいな値だからね」
 ちなみに、古いバージョンの Python では、True,False
の代わりに、整数の 1 と 0 を使っていた。

  >>> a = 100
  >>> b = 200
  >>> a < b
  True
  >>> c = a < b
  >>> print c
  True
  >>>

「なんかヘンな感じね」
「イコールを等号じゃなくて代入子として使ってるから
ね。まぁ、コレは慣れてよ。あと、普通の計算みたいに
演算子の優先順位があって、例えば乗除算は加減算に対
して優先される。だから、優先順位が低い演算は括弧で
くくって優先させる、と」
「当然ね」
「うん、一般常識では当然なんだけど、プログラミング
言語によっては演算子の順位の無いものもあったりする
からね」
「なんでそんな面倒なことするの?」
「コンピュータの処理としては、優先順位がある方が面
倒なんだよ。そんなもの無ければ、頭から計算できるし
ね。それに電卓とかは、優先順位なんて無いでしょ?」
「そう言われればそうよね」
 そもそも普通の電卓で数値は記憶できても、演算子は
記憶できない。
 なお、式が入力できる関数電卓では、普通ちゃんと優
先順位通りに計算する。
「もっと特異な言語になると、演算子の位置が変わるも
のもあるんだ。1 + 1 を + 1 1 とか 1 1 + とか書くポー
ランド記法や逆ポーランド記法って呼ばれる書き方で書
くものもあるんだよ」
「なにそれ? それもコンピュータの都合?」
「そういうこと。コンピュータの内部では、逆ポーラン
ド記法に直して計算してるんだ。だけど、手動入力の逆
ポーランド記法 (RPN) 式の計算機は存在するよ。コンピ
ュータだけでなく、ある種の計算は RPN で書いた方が簡
単だったりするんだよ」
「どんな時よ」
「こんな感じかな。数値と数値の区切りにe (Enter) の
キーを押すとして、

  100-((1+2)*3+(4+5)*6+(7+8)*9+(1-2)*3+(4-5)*6+(7-8)*9)

という式は、

  100e1e2+3*4e5+6*+7e8+9*+1e2-3*+4e5+6*+7e8-9*+-

で書けることになる。括弧は無いし、日本語で自然に
「1と2を足して (1e2+)」てな感じに打てるから、意外
に打ちやすいんだよ。ちなみにこの計算を電卓でしよう
とすると、まず手で括弧を外して式の整理からはじめな
きゃならないから大変だよ」
「こんなヘンな式、何に使うってのよ」
「テストの点数計算とか、化学式の計算とか、フツーに
出てくるけど?」
「それって、フツー?」
「フツーだと思うけど」
「………まぁいいわ」
「えっと、話がそれちゃったけど、さっきやった比較演
算子も演算子の一種だから優先順位があって、四則演算
のさらに下位になる」
「順当ね」
「で、優先順位の最上位って何か知ってる?」
「プラスとかマイナスとかの符号? じゃ、ないわね、
べき乗?」
「ハズレ★ 符号は加減算と同じで、べき乗は乗除算よ
り優位だけど、それよりもっと上位があるんだ。すこ〜
し頭を柔らかくして考えればわかるかも」
「なによそれ………あ、もしかして、括弧?」
「ピンポ〜ン☆ ご名答。括弧が最上位だからこそ、括
弧を使って順位操作ができるわけだね。括弧が演算子扱
いだっての、なかなか気づかないんだよ。まぁ、数学だ
と違うわけだから、無理もないんだけど」
「ふふふ、翔子さんはエライノダ………って、なんてい
うか、小学生のなぞなぞや、頓知 (とんち) みたいね」
「頭を柔軟にする点では似てるかもね。じゃ、最後に、
覚えておくと便利な書き方を一つ。Python では複数の変
数に数値を代入するとき、カンマで区切って一気に書く
ことができるんだ」

  >>> x, y = 55, 66
  >>> print x
  55
  >>> print y
  66
  >>>

「一個づつ代入しなくてもいいってことね。便利かも」
「あとこれの応用で、変数の中身を交換する式を、一気
に書けるんだよ」

  >>> x, y = y, x
  >>> print x
  66
  >>> print y
  55
  >>>

「あ、なんとなく判る」
「感覚で判ってきたら、いろいろ遊んでみるといいよ」

    ☆    ☆    ☆

「まぁ、一回目はこんなとこだけど………どう、疲れた?」
 パソコンを終了させ、翔子が淹れた紅茶で一服しなが
ら、巽は聞いた。
「疲れたわ。計算だけの講義に、これだけかかるとは思
わなかったもの」
 ちなみに巽の部屋では、常時コーヒーメーカーが稼動
している状態で、翔子もマイカップを持ち込んでいる。
 そして、夜眠れないとか、肌に悪いとかぶつくさ言い
ながらも、結構飲んでいっているのだ。
「プログラミングで挫折する理由の第一は、プログラミ
ング言語の手順につまづくことなんだけど、第二はプロ
グラムで何するかがわかってないから、っていうのが多
いんだ。まずコンピュータは文字通り計算機なんだから、
計算に使うことから始めるのが一番簡単だと思うよ」
「手元に電卓が無いときは、使えるかもね………って、
Windows 付属の電卓ってあるよね、確か」
「うん。でも、長い式は打ち間違えもあるからね。式が
残るほうがいいでしょ?」
「イマイチ便利さがわかんない」
「まぁ、まだ始めたばかりだからね。少しづつ便利な使
い方、覚えていけばいいよ」
「最初っから、教えてくれればいいのに」
「プログラミングは、タイピングとは違う。意味も分か
らずにどれだけコードを打ち込んでいっても、上達しな
い。それより、自分の理解出来る範囲で少しづつ使って
いった方がいいんだよ」
「ま、いいわ。しばらくあんたの退屈な講義に付き合っ
てあげる」
 『いや、無理に付き合う必要は無いよ』とは、巽は言
わなかった。
 翔子は、自分が乗り気でない時に巽に付き合うなどと
いうことはありえない。
 つまり、なんだかんだ文句言いながらはまりかけてい
ると、巽は気付いたのだ。
 自分に合ったペースで、少しづつ出来る事を増やして
いけば、そのうち自分の思い通りにコードが書けるよう
になる。
 そして、巽自身気付かないうちに、翔子を教えること
に面白さを感じていたのだ。
「じゃ、今晩はこの辺で」
「うん、おやすみ、また明日ね」

  ☆  ☆  ☆

 なお、巽が生まれて初めて女の子の部屋に訪れて、そ
の時間中計算の講義をしていたという事実に気付いたの
は、それから実に一世紀後だった。
 全身の 99 %を機械化された彼は、コンピュータにサ
ポートされた脳に唐突に浮かんできた記憶に戸惑った。
「ニオイ………アタタカイ………エンザンシ?」
 無論、サポートコンピュータのアルゴリズムが、Python
でプログラムされていたのは言うまでも無い。





P IS NOT PYTHON?

 というわけで、実質一回目です。
 私の、プログラミング言語を学ぶ際のポリシーは、
『プログラムは計算から』です。
 無論、異論もあるでしょうし、『最初はやっぱり"Hello
world!"』という方も多いかと思います。
 特にプログラミング言語を『言語』的に学ぶべし、と
いう方は、一種古色蒼然とした計算から入る方法につい
て、眉をひそめられるかもしれません。
 しかし私は、数学的なロジック (論理) とプログラミ
ングは、不可分だと考えています。
 学生時代の数学が苦手だったとか、現在学生で数学は
苦手だ、という方、安心してください。
 一応理系に進んだ私も、数学の成績は中高通してあま
り誉められたモノではありません(ついでに英語も)。
 ただ、コンピュータは計算機であり記憶装置でありま
すので、数学といっても計算の必要は全く無い上、公式
すら記憶してくれる(あるいは予め知っていて教えてく
れる)のです。
 計算と公式の暗記から解放され、純粋にロジックのみ
をイジって遊べるわけですから、これは結構快感です。
 さらに言えば、自分で勝手に『新しい数学』を作れた
りします。
 たとえば、『剣』に 1 を足したら『+1の魔法の剣』
になったり、悪魔と悪魔を掛け合わせたら、新しい別の
強力な悪魔になったりする『数学』もつくれるのです。
 だからこそ、その根本の『計算っていうけど、一体何
してるんだろうな』ってな所を押さえることが、ロジッ
クの基本になると考えるわけです。
 以上、『計算から』という私のポリシーはすなわち、
『覚えるより、理解し使え』です。
 『習うより慣れよ』と似ていますが、わけもわからず
にコードを書くのは、文中で書いたとおり、私はあまり
お勧めできません。
 プログラムはロジックであり、ロジックは創造的なも
のです。
 慣れるなら、『写す』のに慣れず、『創る』のに慣れ
るべきです。
 よって、使いやすいところから、お話をしていきたい
と思います。
 私の方法論は一般的ではないかもしれませんし、人に
よっては最善ではないかもしれません。
 ただ、私の方法で一人でも多くのプログラミング愛好
家の同志が生まれれば、こんなに嬉しいことはありませ
ん。

 話は変わりますが、人を教えたり、こうして人に見せ
る文章を書いたりすることは、自分自身の勉強にもなり
ます。
 たとえば、白状すればこの文章を書くまで、コンピュー
タでは累乗は出来ても累乗根は出せないと思い込んでい
ました。
 しかし、よく考えてみれば、累乗根は分数乗ですので、
分数乗(小数乗?)してやれば簡単に出来ます。
 愛用の SHARP のポケコン (Zaurus も使ってますが、
ポケコンも2つほど持ってます) でも計算できて、唖然
としています。
 また、次回関数のお話になりますが、三角関数の弧度
法 (radian) を忘れていて、なんで sin 関数が思ったと
おりの数が出ないんだろうか、などとアホなことを考え
ていました (通常の 360度法である degree からの変換
方法とか、次回少しやります)
 いやぁ、ホント、こんな人間が偉そうに人を教える文
章とか書いてていいんですかねぇ (汗)