機械です。
よく考えたら、こっちに先にポストしといた方が、
効率的なので、これから、出来る限りそーします。
※ぎりぎりまで原稿書いてなければ・・・
<i>
VICTIM #3:
" I mean, I killed fifteen of those buggers, sir.
Now, at home, they'd hang me!
Here, they'll give me a fucking medal, sir! "
犠牲者(その3)
「つまり軍曹殿、あたしゃ、ここのクソ野郎共を十五人
殺ったんで。
本国じゃあ死刑だが、ここじゃイカれた勲章が戴ける
ってぇ寸法でさあ」 </i>
by <b>"MONTY PYTHON'S THE MEANING OF LIFE"</b>
0000-0100.ダイクストラ、かく語りき
以上が、私の見聞きした全てである。
いかなる判断を下すかは、この手記を今読んでいる諸
君に委ねるが、私は再現できうるかぎり、事実に忠実に
書き留めたつもりだ。
その中に、心情的な誇張はあるかもしれないが、事実
に誇張はない。
私の正気を疑うのは、当然だろう。
しかしその前に、私の館を一瞬にして崩壊させたもの
がなんであったか、考えていただきたい。
建築の専門家が見れば一目瞭然だろうが、あの館は
『上からの圧力』で崩壊したのだ。
決して『中から爆発』したのでもなければ、『構造的
欠陥によって崩れた』ものでもない。
ならば、館を押しつぶした『何か』が、依然としてそ
こになければならない筈である。
少なくとも、館を押しつぶした数十秒後には、周囲の
住人が館を見に集まってきている。
しかしご存知の通り、彼らは何も見なかったと証言し
ている。
その短時間で移動できるものが、果たしてなんなのか。
私は、その答えをここに記した。
そして程なく、私は同じ力によって、今度こそ死に至
るだろう。
この前は幸運にも逃れられたが、二度目はあるまい。
いや、この手記を残せたことこそ、幸運に思わなけれ
ばならない。
私は、自らの業によって滅びる。
しかし、これを読んだ諸君は、決して私の二の轍を踏
んではならない。
私の蔵書のうち、指定した数冊はアーカムのミスカト
ニック大学の図書館に寄贈し、残りの本及び私の記録に
ついては、警告を告げるこの手記を除き、すべて焼却す
ること。
私はこれから、崩壊した私の館に赴き、最後の仕事を
済ませる。
願わくば、この地上に二度とあの、忌まわしき古えの
神々の紋章が現れんことを。
以上が、四畳半のアパートの一室で圧死した小説家の
原稿の全てである。
哀痴県警では、作家がク・リトル・リトル神話をモチー
フにした下らない小説を書いたため、旧支配者の怒りを
買い、ショゴスに圧殺されたものとして、捜査を打ち切
った。
近くこの作家の遺体は、乾燥粉末にして有機肥料とし
て廉価で販売される予定である。
☆ ☆ ☆
「世の中は、楽しいものだなぁ」
窓の外を見ながら、物憂げにユカイなことをのたまう、
天美修也であった。
「先輩、それ、『空しい』の間違いじゃないですか?」
同じく暇をしていた朽縄巽が、突っ込みを入れる。
生徒会長 (生徒会執行部長) の大鳥翔子と、書記の木
崎美央は、現在打ち合わせで職員室に呼ばれている。
残された男子二人は、いつになくのんびりと刻を過ご
していた。
「いや、『楽しい』だよ」
「科白と顔が合ってませんが」
「いや、これが俺の、楽しくて楽しくて仕方の無い顔な
んだ」
苦悩に悩むウェルテルのような顔をしながら、楽しい
と連発する天美先輩。
そこには、冗談なのか狂気なのか、計り知れない不気
味さがあった。
「ああ、なぜにこの世の中は、楽しくて楽しくて仕方な
いのだ。いっそこのまま、弾みで永遠に生きてしまいそ
うな気させしてくる」
「不死身って、弾みでなれるモンなんですか?」
さらっととんでもないことをのたまう先輩に、巽は自
然に突っ込みを入れる。
「そうだ。ああ、恐ろしい。永遠に生きる。なんと忌ま
わしいことか」
「人間の理想だと思うんですけど」
巽が、ごく常識的な答えをすると、先輩は重々しく首
を振る。
「バカを言っちゃいけない朽縄くん。君は大腸菌にまで
退化したいのかい?」
「大腸菌、ですか?」
唐突にバクテリア(細菌)だ、原核生物だ。
「そうだ、大腸菌だ。大腸菌は不死身だ」
逆性石鹸の破壊力をも恐れぬ、大胆不敵な言葉だ。
「初耳です」
世界の大半の人々には、初耳だろう。
「俺たち人間は、細胞の一つ一つが死んだからといって、
個体の死とは言わないだろう。細胞全体が細胞分裂を止
めた時、それが個体の死だ」
「まぁ、そうとも言えますね」
「然るに、大腸菌は永遠に細胞分裂を繰り返す。よって、
不老不死なのだよ」
いつから個体群は、個体と同義になったのだろう。
「さぁ、大腸菌になりたいなら、なり給え」
「なれませんてば」
大したことない突っ込みに、嬉しそうに頷く先輩。
「そのとおり、なれない。卑しくも人間は、大腸菌如き
に憧れてはならないのだ。ああ、不老不死のおぞましい
ことよ」
「………で、なんで楽しいと、弾みで不死身になるんで
すか?」
怪しげな論法から逃れるべく、話をそらす巽。
しかし、先輩の恐るべき話は続く。
「もちろん、楽しくて死ぬのを忘れてしまいそうだから
だよ」
「はぁ?」
「我らは、死ぬという崇高な使命を帯びてこの世に生ま
れてきたというのに、この世の楽しさは、その使命すら
忘れてしまいそうだ」
百人中九十九人が、喜んで辞退しそうな使命である。
「僕は、そんな事ぐらいで死ねなくなるなら、結構なこ
とだと思うんですけど。世の中には、生きたくても生き
ていられない人のほうが多いんじゃないですか?」
「生きられないということは、すなわち生きることに絶
望し、死を受け入れたということだよ」
「壮絶に間違ってるような気がします」
そんな妙な理屈が真理であったら、たまらない。
「そうかな? 死を望まないのに死んでいく人は、何故
望まないんだ?」
「そりゃぁ、まだ生きてやりたいこと、やりたいからで
しょう?」
「それまで生きてる間に出来なかったことが、それ以降
生きててやれる保証はあるのかね?」
「生きてる間にできたこと、またしたいかもしれないじ
ゃないですか」
「それも同じだよ。できる保証はどこにもない」
またぞろ、話が怪しくなってくる。
巽は、慎重に言葉を選びながら反論する。
「まぁ、そうですけど。死んだら可能性はゼロですけど、
生きてたら可能性はゼロじゃないわけですし………」
「可能性なら、宝くじを買って1等を当てる可能性だっ
てあることはあるよ」
「そうです。だからみんな、宝くじを買うんでしょ?」
「俺は買わない。君は?」
「いや、買いませんけど………」
にやりと笑う先輩。
「なぜ、買わない?」
「そりゃ、買って得する確率のほうが圧倒的に低いから
です。でなきゃ、収益が上がる筈無い」
こういう考え方をする人間は、決してギャンブルの楽
しみを味わうことは出来ない。
「その通り。とすれば、今まさに死なんとしている人が
例え生き延びたとして、その人がやりたいことをやるま
で生きられるという確率は、死を拒む力になるほど、高
いのかね?」
そう言う話なのだろうか?
「僕は買わないけど、買う人もいるでしょう。そういう
人の中には、次は当たると確信して買ってる人もいるで
しょう。そういう人は、死を望まないんじゃないですか
?」
「当たると確信して、当たらなかったら『おかしいじゃ
ないか』といって、宝くじの販売所に文句を言いに行く
人はいるかね?」
「いないとは言いませんが、ごく僅かでしょうね」
そんなのが大勢居たら、宝くじ売り場には警備隊が常
駐する必要がある。
「その通り。つまり、どこかしら人間は、死ぬことをち
ゃんと覚悟しているのだよ。よって、死を宣告されると、
生に絶望し、死を受け入れて死んでいくのだよ」
それで納得する人間、いるのか?
「いや、知らない内に死ぬ人もいますが」
即死とか。
「知らない内に死んだ人の話、聞いたことあるのかね?」
「いや、死人は話しませんから」
死人に口無し、当然である(使い方、違うけど)
「彼らは、死を受け入れたからこそ、死んだのだよ」
勝手に死人の代弁をするな。
「でも、死にそうになった人の話はありますが」
「臨死体験は、死を拒んだ人の体験だよ。彼らは生に絶
望しなかったから生きられたわけだな」
「いや、『死を覚悟しました』って人、結構居ますが」
「でも実際は、生に絶望しきれず、死を覚悟できなかっ
たからこそ、生きてるわけだな」
ああいえばこう言う。
そろそろ、巽はキレかけた。
いや、キレるほど、高尚な話ではないはずなのだが、
こういう話は、ムキになりやすいのだ。
「そ、それなら逆に聞きますが、先輩は死んだ人にちゃ
んと聞いたことがあるんですか」
「もちろん」
「……………」
「……………」
をい
「……………」
「……………冗談、ですよね」
「いや、冗談でなく」
「せ、先輩………」
それって、やっぱり………
「もちろん…………無い」
「……………は?」
「だから、死人から話を聞いたことは、無い。で、冗談
は、今までの話なんだけど」
「……………」
「……………」
「……………冗談、なんですね。ああ良かった。先輩は、
本気で電波系かと思いましたよ」
いや、こんな冗談かますヤツは、少なくとも正常では
ない。
「俺の話は冗談だが、もし本当だとしても、朽縄くん、
それが本当でないと証明できるのかな?」
楽しそうに言う先輩に、巽は絶句した。
「世の中、楽しいものだなぁ」
今度は本当に楽しそうに、呟いた。
☆ ☆ ☆
「伸ばし伸ばしにしてたけど、今日こそ、制御構文の話、
します」
「ぱちぱちぱち」
「………なに、それ?」
「なんとなく」
今一ヤル気があるのかないのか微妙な翔子に、巽は尋
ねる。
「もしかして、構文やるの、イヤ?」
「イヤっていうか………ほら、構文って言うと、どうし
ても退屈な英語構文とかしか思い浮かばないじゃない。
だから、なんかメンド臭そうなイメージあるから」
学校教育の、悪しき影響である。
「う〜ん、でもほら、例の『プログラマの三大美徳』を
思い出してよ。僕らは、コンピュータをコキ使って自分
が楽するためにプログラムを書くんだから、面倒だと思
ったら、そっちの方が間違ってるってこと」
「つまり、制御構文って、楽するために覚えるのね?」
「そういうこと。昔は制御構造だけでプログラム書いて
たから、物事を『プログラムとして考える』こと自体、
とてつもなく面倒だったんだけど、今のプログラミング
はそんなこと無いから」
「あ、そうなの」
「うん」
作業をフロー制御で考えるのは、慣れれば(嵌れば)
意外に簡単ではあるが、慣れる前に挫折する人も少なく
ない。
同じく作業を全て関数で考えたり、オブジェクトとメ
ッセージで考えたりするプログラミング方法もある。
ちなみに Python は全ての折衷で、都合の良い時に都
合の良い考え方が出きるようになっている、言わばノン
ポリ型である。
「じゃ、先ずは条件分岐の話をしよう。例えば、変数の
値が 10 以上なら'OK!'と表示するプログラムは、こんな
風になるよ」
<tt>
>>> a = 10
>>> if a >= 10:
... print 'OK!'
...
OK!
>>>
</tt>
「イフ? 『もし〜ならば』ってこと?」
「うん、正確には'if'と':'の間に判定式を書いて、その
判定が真なら、ブロック内の処理が行われるっていう規
則だね」
「ブロックって?」
「字下げしてる部分だよ。今の場合だと、print 文一つ
だけだけど、字下げさえしてあればいくつでも書けるよ」
<tt>
>>> if a >= 10:
... print 'O'
... print 'K'
... print '!'
...
O
K
!
>>>
<tt>
「わかった?」
「うん。でもさ、あたし思うんだけど」
「なに?」
「なんかこの文、意味あるの?」
巽は肩をすくめる。
「確かに、条件分岐って、何回も使わないと意味無いか
らなぁ。関数にまとめてみようか」
<tt>
>>> def over10(a):
... if a > 10:
... print 'OVER 10!'
...
>>> over10(10)
>>> over10(100)
OVER 10!
>>>
</tt>
「どう?」
「10 以上とか、見れば判るわよ。たとえば、数字が7の
倍数かどうか、ぐらいだったらまだしも」
直接数字を入れればそうだが、変数なら判るとは限ら
ない。
しかし巽は、翔子の案に乗る。
「7の倍数か、面白そうだね」
「あと、そうでなかった時も、無反応じゃなくって、何
か無いの?」
「おっけ。次に説明するつもりだったから、ちょうどい
い。じゃ、数値を入れて、7の倍数なら'multiple of 7
'、7の倍数でなければ'not multiple of 7'と表示する
ことにしよう。倍数ってことは、割った余り…剰余が0
ってことだよね。剰余は、Python では'%'っていう演算
子を使えば出せるよ」
「'%'は百分率じゃないの?」
「まぁ、実際色々に使うけど、百分率と関係あるのは無
いなぁ。割り算と余りを一発で出す、divmod ってのはあ
るけど、ここでは余りしか関係無いからね」
「御託はいいわ。とりあえず書いてよ」
「はいはい」
<tt>
>>> def m7(n):
... f = n % 7
... if f == 0:
... print 'multiple of 7'
... else:
... print 'not multiple of 7'
...
>>> m7(49)
multiple of 7
>>> m7(499)
not multiple of 7
>>> m7(455)
multiple of 7
>>>
</tt>
「察するに、'else:'っていうのが、『そうでなければ』
って意味ね」
「そのとおり」
「英語の意味のまんまね」
「英語は世界標準語だから」
世界標準語としてなら、いっそ『世界標準英語』を制
定してほしい。
そうすれば、英語圏文化を強制的かつ優先的に学ばさ
れる必要も無いだろう(いや、別に英語圏文化が嫌いな
わけではないが、強制的に学ばされるのがなんとなく腹
が立つので)
なお、プログラミングに使用される英語の綴りは、通
常イングリッシュではなくアメリカンである(多分、綴
りが簡単なので)
「イギリス人かアメリカ人が作った言語だから、じゃな
いの?」
あまり知られていないが、世界最初のコンピュータは、
イギリスのケンブリッジ大学で作られていたりする (EDSAC
1949)。
「Pythonの作者のGuido van Rossumは、オランダ人だよ」
「なんでオランダ人なのに英語なの?」
オランダ人なのにMonty Pythonフリーク。
「だから、『標準語だから』だってば。例えばスイス人
の書いた Pascal って言語でも、日本人の書いた Ruby
って言語でも、基本的には英語を使ってるよ。ホントの
ことを言えば、他の言語は、アルファベット以外を使う
から、文字コードの点で難しくなっちゃうっていうこと
もあるけどね」
「日本語では、プログラミング言語は作れないってことね」
「いや、実はいくつかあるけど、日本語で書けるからっ
て、別に簡単になるわけじゃないしね」
無論、洪水のように英語が氾濫するプログラミング言
語 (Smalltalk など) の場合、さすがに英語に多少は慣
れていないと辛いかもしれないが、大半の言語は、英語
力に関係無くプログラミングできる。
「なんか誤魔化されてるような………」
「英語だと、不都合?」
「ううん、別に。でもな〜んか、すっきりしないのよ」
「そうかな。僕は日本語が基本だと、コーディング…プ
ログラムを書いてる途中に、いちいち変換しなきゃなら
ないから、かえって面倒なんだけどね」
「ああ、違和感の理由、わかった。あんた、英語苦手じ
ゃなかったっけ?」
そういう理由かいっ!
「う、うん」
「たしか成績、最低よね」
巽は頬を引きつらせながらも、答える。
「あ、赤点取らない程度だけど、確かに、誉められたモ
ンじゃないよ」
作者と同じである。
「それで、なんで英語で平気なのよ?」
「なんでだろう?」
「聞き返さないでよ」
巽は、少しだけ考えた。
「う〜ん、そうだなぁ………多分英語というより、記号
としか見てないから、かもね。変化とかしないし」
「ないの?」
「無いよ」
巽は言い切ったが、実は reversed という名の関数が
あったりする。
これは実際、reverse という『関数に似たもの』に関
係がある。
しかし、それが言語のように命名法則として成り立っ
ているわけではなく、単なる特例である。
なお、変化が命名法則に取り入れられているプログラ
ミング言語も存在する。
ネイティブスピーカーにとってはわかりやすいのだろ
うが、残念ながら筆者を含め、英語が苦手な人間にとっ
てはイヤガラセ以外の何物でもないと感じてしまうとこ
ろが悲劇だ。
「逆にいえば、英語が苦手な僕でも書ける程度の英語し
か出てこないってことだから、いいじゃん」
「そういうことね。まぁ、それで納得しとくわ」
「じゃ、本題に戻ろう。'else'は、'if'の条件に『あて
はまらない』ときだけが実行する内容を書くんだ。これ
で、条件によって2種類の選択肢を作ることができるわ
けだね」
「3種類だと、どうなるの?」
「例えば?」
「10未満はA、10以上20未満はB、20以上はCとか」
「それって、ifを三つ書けばいいんじゃない?」
「あ、そっか」
「じゃ、とりあえず関数名をtとして、書いてみて」
「うん」
<tt>
>>> def t(n):
... if n < 10:
... print 'A'
... if 10 <= n < 20:
... print 'B'
... if n >= 20:
... print 'C'
...
>>> t(5)
A
>>> t(15)
B
>>> t(25)
C
>>>
</tt>
「これでいいでしょ」
「うん、上出来。特に、10 以上 20 未満って、よく書け
たね」
「バカにしないでよ。≧を'>='と書くの知ってたら、誰
でもわかるわ」
余談だが、Python 以外の言語では、この書き方で不等
式を書くとエラーを起こすか、あるいは正常に判定でき
ない場合が多いので注意(実は Python が、かなり特殊
なのだ)
「でも、10とか20とか、2回も書くの、面倒だよね」
さりげなく、水を向ける巽。
「う〜ん、なんかさっきの else を使って簡単に出来そ
うな………あっ、そうだ。else の中に、if 文って、も
う一つ入るの?」
「いくつでも」
「じゃ、このほうが簡単かも」
<tt>
>>> def t(n):
... if n < 10:
... print 'A'
... else:
... if n < 20:
... print 'B'
... else:
... print 'C'
...
>>> t(5)
A
>>> t(15)
B
>>> t(25)
C
>>>
</tt>
「完璧?」
「………絶句」
「ふふふ、遠慮なく天才と呼び給え」
「いや、冗談抜きにすごいよ。こういうのって、慣れて
ないとなかなか思いつかないからね」
もちろん、若干誘導されてはいるのだが、翔子はまず
まず優秀だと言って間違いない。
「こういう風に字下げ部分のブロックが深くなってくこ
とを『入れ子になる』または『ネストする』って言って、
重要な概念なんだよ。でも、今回に限って言えば、これ
って若干、問題あるって判る?」
「問題? ………そうね、いまは2選択だからいいけど、
選択肢が増えたら、入れ子も増えちゃいそうね」
「ズバリそれ。入れ子が増えることを『ネストが深くな
る』って言うんだけど、あまりネストが深くなると、ソー
スコードが読みにくくなっちゃうんだ。特に、選択肢み
たいな簡単なもので、あんまりネストを深くするのも問
題あるから、実は多選択用の書き方、あるんだよ」
「………先に言いなさいよ」
上目で睨む翔子に、巽は首を振る。
「いや、言わなかった方がいいんだよ。だって、コレを
自分で考えたなら、意味はすぐわかると思うから」
<tt>
>>> def t(n):
... if n < 10:
... print 'A'
... elif n < 20:
... print 'B'
... else:
... print 'C'
...
>>> t(5)
A
>>> t(15)
B
>>> t(25)
C
>>>
</tt>
「あ………'elif'って、もしかして'else-if'のこと?」
「その通り。これなら、ネストが深くならないから、あ
る程度並べても見られるでしょ?」
「書き方が違うだけで、やってることは同じよね」
「結果はね。でも、書き方違うと見やすくなるし、コン
ピュータ内部でも、ネストが深くなると余計にメモリを
使っちゃうから、結果的にはこれがベストなんだよ。た
だ、どういう仕組みで分岐を考えるか、っていうのは、
翔子が考えた方法と同じってことだよね」
「なるほどね」
「じゃ、次は反復構造………」
「ストップストップっ! このまま続けてなんて、やっ
てられないわっ。我々はティーブレイクを要求するっ!」
「我々って、誰と誰だよ」
「あたしと、巽」
僕の意見は決定済み?(汗)
「……………ふ、深く考えるのはやめよう。でもまぁ、
休憩はいい考えかもしれない。一服しようか」
「うんうんっ。あ、そうそう、いい葉っぱと美味しいク
ッキーあるから、お茶淹れるわね」
「ありがと」
ぱたぱたと階下に駆けてゆく翔子を見送りつつ、巽は
深くため息をつく。
確かに、制御構文を理解するのは、少し骨かもしれな
い。
『制御構文』を廃止した言語もあることはあるが、
『制御構造』を無くすわけにはいかず、結局再帰やブロ
ックに対するメッセージといった方法で再現している
(その方法の良し悪しはともかく、それによって画期的
に理解しやすくなったという話はあまり聞かない)
結局プログラミングは、最低限度の制御構造からは逃
れられない宿命にあるのだろう。
なぜなら、それこそがプログラミングの強みでもある
からだ。
条件により処理を変化させ、必要なら同じ処理を繰り
返す。
直線的に行う処理にこの二つが加わることにより、プ
ログラムの可能性が一気に広がる。
そのメリットを捨ててまで、プログラミングを学ぶ必
要性があるのかと問われれば、NO といわざるをえないだ
ろう。
「なんか難しい顔してるわね」
「うん、やっぱり何のかんの言っても、制御構文ってネ
ックだな、と思って。昔よりは随分簡単になった筈なん
だけどね」
「必要なんでしょ?」
「うん。どう考えても、この話は避けられない」
「だったら、できるだけ簡単に、でいいじゃない。あた
しも、全く苦労無しに覚えられるとは、思ってないんだ
から」
「そうだね」
それから、しばらく雑談した後、講義を再開する。
「さて、じゃ次に行こうか。実際、どうしても必要な制
御構文って、もう一つだけだから、これやったら今日は
終わりにしよう」
「二つだけでいいの?」
「うん。エドガー・ダイクストラ (E.W.Dijkstra) の
『構造化定理』によれば、三つの『基本制御構造』で全
てのアルゴリズム(プログラム)が書けるそうだ。事実
彼は、それを数学的に証明したしね。その三つの基本制
御構造が『順次』『選択』『反復』なんだよ。今『選択』
をやったから、あとは『反復』だよ」
「『順次』っての、やってないじゃない」
「ああ、『順次』って、上から順番に実行するってだけ
のことだよ」
「あ、そうなの」
「だから、変則的な制御って、要するに二つだけだね。
『構造化定理』には、今の『基本制御構造のみでコード
を記述すること』の他に、『無条件ジャンプを使わない』
とか『プログラムの入り口と出口を一つづつにする』な
んていうのがあるんだ。まぁ、Python では無条件ジャン
プ構文はそもそも無いし、出入り口を複数作る方が難し
いからねぇ………」
「で、そのダイクストラのなんたらと、今からやる反復
の講義に、なんか関係あるの?」
「あんまし………ないかも。いや、でも、三大構造とい
えばダイクストラ………」
「ダイクストラかツァラトストラか知らないけど、カン
ケー無いことは言わないっ!」
「………はい、済みません」
「ったく、その自慢癖やめないと、あんたの話、誰も聞
かないわよ」
「………そうだね、気をつけよう」
巽が反省したと見るや、翔子はさっさと文句を打ち切
った。
これが、しつけの基本である(犬の………)
「じゃ、反復の話ね」
「うん。反復っていうのは、文字通りある処理を何度も
くり返すって意味なんだ。ただ、気をつけなきゃいけな
いのは、無条件にくり返してるとプログラムが止まらな
いから、くり返す条件をつける必要があるんだ。とりあ
えず、'spam'と百回書くプログラム、書いてみるね」
「またスパム?」
露骨にイヤな顔をする翔子。
「じゃぁ、'Ni!'を100回」
「なによそれ」
「お約束です」
お約束の多い、Pythonの解説書。
「あと、print 文の最後にカンマを書くと、改行しない
で、ホワイトスペースで区切られて表示するから、今回
はそれを使うね」
<tt>
>>> c = 100
>>> while c > 0:
... print 'Ni!',
... c -= 1
...
Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni!
Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni!
Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni!
Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni!
Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni!
Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni!
Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni!
Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni!
Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni!
Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni!
>>>
</tt>
「'c -= 1'って、えっと………どっかで見たわね………
(ノートをぱらぱらとめくる。結局、テキストで書いた
ものを、打ち出しているのだ)………あ、あった。変数
から1引いてるのね」
「そういうこと。while は、ブロックの中の処理を、while
につづく条件式が満たされている間、ずっとくり返すん
だ。だからこの場合、カウンタとして使ってる変数 c が
1づつ減ってきて、0になると、『0より大きい』の条
件が満たされなくなって、くり返しが終了するんだ」
「なんか、条件分岐の特殊版みたいね」
「そうだね。本来は、条件分岐と無条件ジャンプで作ら
れてた構造だから」
「さっきPythonには無いって言ってた、あれ?」
「そうだよ」
「じゃ、無条件ジャンプがあったら、if 文でも書けるっ
てこと?」
「いや、無くても書けるよ。if 文と、関数定義さえあれ
ばね」
「それなら、while 文なんて、覚える必要無いじゃない」
「そうかなぁ? ま、いいや、書いてみよう」
<tt>
>>> def p(c):
... if c == 0:
... return
... else:
... print 'Ni!',
... return p(c-1)
...
>>> p(100)
Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni!
Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni!
Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni!
Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni!
Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni!
Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni!
Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni!
Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni!
Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni!
Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni!
>>>
</tt>
「ごめん、あたしが悪かった。絶対、while 文のほうが
簡単だわ」
「これは、関数の中で自分自身を呼び出す『再帰』って
いう手法だけど、まぁ、一般的ではないね。それに Python
だと、この方法、普通 1000 回ぐらいまでしか使えない
んだ」
ちなみに筆者の環境で試したところ、998 回までが限
度だった。
なお、この制限は調節できるが、その場合、システム
がクラッシュする恐れがあるので、あまり弄らないほう
が良い。
よって Python では、素直に while 文などを使うこと
をお勧めする(言語によっては、再帰でしか反復構造が
再現できない言語もあったりするが)
「あと、次に説明するけど、回数を固定するなら、他の
くり返しの方法もあるんだ」
「どうせ次に出てくるなら、今ちゃちゃっと出しちゃい
なさいよ」
「じゃ、とりあえず説明は省いて、予告編だけね」
<tt>
>>> for c in range(100):
... print "Ni!",
...
Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni!
Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni!
Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni!
Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni!
Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni!
Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni!
Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni!
Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni!
Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni!
Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni! Ni!
>>>
</tt>
「なんか、随分簡単な気がするんだけど………これで覚
えちゃいけないの?」
「これを説明するには、事前にまだ沢山説明することが
あるからね。まぁ、回数限定である処理を行うっていう
だけの使い方なら、覚えてもいいけど………あんまり、
そういう公式みたいな覚え方、させたくないんだよなぁ」
「だけどこれ、明らかにwhileより簡単じゃない」
「いや、難しいよ。そもそも、何が起こってるか、わか
る?」
「100 回繰り返してる」
「どうやって?」
「それは………知らないわよ、そんなの」
「でしょ。これ、正確に理解してれば、こんなこともで
きるんだよ」
<tt>
>>> for x in 'aiueo':
... print x * 10
...
aaaaaaaaaa
iiiiiiiiii
uuuuuuuuuu
eeeeeeeeee
oooooooooo
>>>
</tt>
「な、何が起こったの?」
「わかんないでしょ? だから、順を追って説明してく
から待っててよ」
「でも………」
「プログラミングを、『理解する』じゃなくて『使える』
から覚える方がいいっていう人もいるけど、自分流に応
用効かないのって、結局使えないのと同じなんだよね。
大丈夫、Python は覚える文法がそんなに無いから、すぐ
にこれくらい、使えるようになるよ」
「………わかった。そこらへんは、あんたに任した」
「ありがと」
必要ならば信頼して任せるのも、しつけの基本である
(子供の)。
「で、whileだけにしか出来ないこと、あるんでしょ?」
「うん。for はいずれにせよ、回数を最初から決めたルー
プしかできないけど………」
「ちょっと待った。ループって何よ?」
「あ、くり返しのこと。ぐるぐると回るみたいなイメー
ジだから、ループとも言うんだ」
「あっそ」
「うん。それで、while は、回数を決めないループがで
きるんだ」
「どんな時に使うのよ」
「たとえば、こんなのどうかな? 数値を入れたら、消
費税計算して 1.05 倍してくれるっての」
「そうねぇ、どうせなら、税込みから、税抜き価格と消
費税を計算してくれた方がいいかも」
「オッケ」
<tt>
>>> i = 1
>>> while i > 0:
... i = input('税込み価格= ')
... i0 = int(i * 0.05 / 1.05)
... i1 = i - i0
... print "税抜き =",i1
... print "消費税 =",i0,'\n'
...
税込み価格= 105
税抜き = 100
消費税 = 5
税込み価格= 1200
税抜き = 1143
消費税 = 57
税込み価格= 8000
税抜き = 7620
消費税 = 380
税込み価格= 0
税抜き = 0
消費税 = 0
>>>
</tt>
「あ、なんかプログラムっぽい」
翔子の言葉は、巽にはよく理解できた。
実際、自分が最初にプログラムを書いた時も、バッチ
式プログラム(最初から最後まで自動的に一括処理され
るプログラム)を書いて動かした時より、このような対
話式プログラムを書いた時のほうが感動した覚えがある。
そして while ループは、手軽に対話式プログラムを作
る便利なツールである。
「何が起こってるか、判る?」
「そうね、i のテストしてるから………あ、そっか。0
入れると i が 0 より大きいっていう条件が成り立たな
くなって、終了するのね」
「そうそう。あと、細かいトコ説明すると、print 文で
カンマで区切ると、複数の値が1行で表示できるんだ。
それから、int 関数は浮動小数点数を整数に変える関数
だよ。税計算で、どうしても小数が出るからね」
「ねぇねぇ、
<tt>
int(i * 0.05 / 1.05)
</tt>
じゃなくて、
<tt>
i * 5 // 100
</tt>
じゃダメなの?」
「……………」
「……………」
「……………はい、その通りです」
「ひひひ、一本」
「く、くぅ〜っ! なんか本気で悔しいっ!」
「まぁまぁ、君も精進し給え」
時々は飼い主の優位性を示さなければならない(当然、
犬のしつけ)
「今日は眠れそうにないな」
「ん〜? あたしの教訓が身にしみて?」
「違うっ! 悔しくてだっ!」
「きししし。さて、本日はこれで終わり?」
「終わりだよっ!」
「ありがとぉございましたぁ(笑)」
「ちっきしょぉーっ!(泣)」
☆ ☆ ☆
「ただいま」
「……………」
「今日はね、楽しいことがあったんだ」
「……………」
「いやぁ、後期から、生徒会に入ってきた、朽縄くんて
子、面白い子だよ」
「……………」
「俺の話にさ、結構真面目に突っ込みいれてくれるんだ
から」
「……………」
「うん、彼にはもちろん、普通の世界しか見えてないん
だけどね」
「……………」
「色々、論理的に考えることはいいことだよ。そうすれ
ば、自分が知覚する世界なんて、どれだけ小さいものか、
だんだん判ってくるからね」
「……………」
「ははは、キミからすれば、俺も彼も同類かもね。その
通り、キミの知覚力の範囲には、どうやったって及ばな
い。俺はそのことを身を以って知ってるだけだからね」
「……………」
「さぁ、今日も聞かせてよ。南極大陸でキミたちが見聞
きしたことを。俺たちの祖先や、あの不定形のしもべを
作り出したいきさつを」
大きなヒトデのような頭をしたソレは、静かに頷いた。
<翔子のノート(論より翔子?)>
Lesson 4.
if文(条件分岐文、選択文)
<パターン1>
if 条件式:
条件が真のとき実行する文
<パターン2>
if 条件式:
条件が真のとき実行する文
else:
条件が偽のとき実行する文
<パターン3>
if 条件式1:
条件1が真のとき実行する文
elif 条件式2:
条件1が偽で、なおかつ条件式2が真の時
実行する文
else:
条件式が全て偽のとき実行する文
剰余演算子'%'
a % b ⇒ a÷bの余り
比較連結
a < b <= c ⇒ aがb未満で、かつbがc以下の時、真
while文(反復文)
<パターン1>
while 条件式:
条件式が真の間、繰り返し実行される
for文(現時点では、回数限定の反復に使用。詳細は後ほど)
<パターン1>
for カウンタ変数 in range(反復回数)
反復回数繰り返される実行文
input関数
i = input(プロンプト文字)
キーボードからの入力を求め、入力内容を『評価』して返す
<後記>
前回に引き続き、ほぼ書いた原稿の半分は没になりま
した。今回、没になった主な内容は、BASIC のコード。
制御フローの代わりに BASIC コードで書けば簡単かな、
と思ったのですが、結局よけいわかりづらくなったので、
中止。そもそも BASIC で入門するなら、Python を使う
必要無いですからね。
今回の分量はやや少なめになっていますが、条件分岐
と反復という重要な構造を扱っていますので、内容的に
は決して少ないわけではありません。それどころか、ア
ルゴリズムは基本的にこの二つで作るわけですから、こ
れを理解すれば根本的なプログラミング原理は習得でき
たと言っても過言では無いでしょう。
次回は、近現代的なプログラミングに欠かせないツー
ルであるコレクションの話とともに、オブジェクトの操
作といった話題に入っていきたいと思います。コレクシ
ョンを駆使すれば、旧世代の言語や低級言語では考えら
れなかったプログラミングスタイルが実現できます。そ
れとともに、徐々に Python という言語の本領発揮とな
りますので、ご期待ください。