作者: 機械伯爵
日時: 2005/10/31(00:32)
"AND NOW
 FOR TEN SECONDS
 OF SEX"
「10秒ほど、アレやってるとこ、映します」
BY "MONTY PYTHON'S FLYING CIRCUS"



0000-0011.もじの反転(The Turn of the String)

 さくら
 さくら
 いちめんの、さくら
 さくらふぶき
 さくらふぶきのなか、

 きがつくと、
 きがつくと、だれもいない
 ひとり、
 ひとり、そこにたってた
 ひとり
 ひとり、で

 ふあんになって、
 ふあんになって、かけだす

 てんちが
 ぎゃくてん
 した

 じめんに
 かたいじめんに
 つめたいじめんに
 たたきつけられて、
 こきゅうがとまる
 あたまがとまる
 まっしろになる
 まっしろに

 そして、
 そして、みた
 わらわない、め

        ☆      ☆      ☆

「朽縄くん、今日午前中休んだよね。どうしたの」
「寝不足」
 朽縄巽は、答えながら大きな欠伸をひとつ。
 木崎美央は呆れながらも、くすくすっ、と笑う。
 放課後、こうして一緒に生徒会室に向かうことが多い。
 同じクラスで、同じ生徒会役員なのだから、当然とい
えば当然なのだが、美央は少しだけその行程を楽しんで
いた。
 そもそも地味な性格で、普通の友達はいるものの、特
に仲の良い友達となるとまだいない美央にとっては、生
徒会活動で一緒の巽は、自然と一番よく話す相手となっ
ていたのだ。
 もっとも、巽が翔子との長い付き合いで女子にも慣れ
ていて、話しやすかったというのも理由の一つだが。
「だめだよ朽縄くん、徹夜でゲームとかしちゃ………」
 巽は今日の午前中、出てこなかった。
 一学期中、遅刻にも欠席にも無縁だった巽だけに、美
央は心配したのだ。
 ちなみに美央は、皆勤である。
「そうだ、やりたいゲームあったのになぁ。親父のお陰
で、昨日は眠る暇なかったし」
「え? お父さんがどうかしたの?」
 ゲームじゃなかったのね、と思いながら聞く美央に、
巽は眠そうに一言。
「寝かせてくれなかったんだよ」
「え? え?」
 はっきりした事を聞かないうちに、生徒会室に入るや
いなや、巽はいきなり席について机に突っ伏した。
「少し寝る」
「あんた、またアレなの?」
 すでに来ていた大鳥翔子は、いつものこと、とばかり
にため息をついただけで、珍しく構わなかった。
 もし生徒会活動中に巽が寝ていようものなら、容赦な
く鉄拳制裁を下す普段の翔子とのあまりにも態度の違い
に、美央は驚きを隠さずに聞いた。
「あの………朽縄くん、午前中休んだんですけど、一体
何があったか、大鳥先輩、ご存知なんですか?」
 美央の言葉に苦笑する翔子。
「おじさま、巽を可愛がるのもいいけど、やりすぎなの
よね」
 なにやら何重にもアヤしげな雰囲気の解答に、美央は
ごくんとツバを飲み込む。
「あ、あのぉ………おじさまって?」
「巽のお父さん。朽縄龍介(くちなわりゅうすけ)って
言うんだけど、巽からは想像出来ないイイ男よ。SEと
かやってるようには全然見えないワイルドな感じで。あ
あ、さえないウチのお父さんと取っ替えてほしいなぁ、
なんて」
 翔子が巽の父親を誉めれば誉めるほど、美央の脳内の
妄想がむくむくと沸き起こる。
 特に巽が、線の細い、結構顔かたちの整った少年であ
るだけに、その組み合わせはあまりにもデンジャラスだ
った。
「そそそそそそのっ、お、おとおとおとうさんと、く、
くちなわくんは、い、いったいなにを………」
「何をって、アレよ」
 美央の頭が、爆発して真っ白になる。
 翔子は気づかずに続ける。
「ほら、巽ってプログラムとか書けるじゃない。だから、
時々おじさまの持って帰る残業を手伝うこと、あるんだ
って。えっと………なんて言ったかな、デバッグとかな
んとか………。おじさまは巽を昔から可愛がってて、巽
に自分の仕事教えてるうちに、手伝いできるようになっ
たんだって。まぁ、こんなサエない子だけど、そういう
面だけはちょっとすごいかもね………って、木崎ちゃん、
なに白目剥いて放心してるの?」
 翔子が美央の肩をゆすったが、美央は「朽縄くんが…
……美形のお父様とアレ………えへえへ………」と、な
んだか意味不明な言葉をつぶやきながら、当分正気に戻
りそうになかった。
「どうしたの?」
 最後に遅れて入って来た天美修也に、翔子は首をふる。
「なんだか今日は、一年生の子たち、どっちも使い物に
ならないみたい。どうする?」

        ☆      ☆      ☆

「一体何があったんだ?」
「さぁ?」
「さぁ? ってことないだろ? 目を覚ましたらいきな
り木崎が、真っ赤になって目を合わせないなんて、いく
らなんでも変だろ? 一体ナニ吹き込んだんだ?」
 翔子がキレかける。
「ホントに知らないわよっ! あんたがなんで休んだの
か聞いてきて、それを説明しようとする前に放心しちゃ
ったんだから」
「なに誤解したんだろ?」
「さぁ?」
 つくづく、そっち系には疎い二人であった。
 例によって例の如く、翔子の部屋である。
 珍しく巽が、直接翔子のパソコンに触って作業をして
いた。
 その暇な間、昼の美央のおかしな様子を話していたの
である。
「まぁいいか。何考えてたにしろ、誤解は解けたみたい
だしね」
「そうね。それより、おじさまの仕事の手伝いとはいえ、
平日に徹夜するなんてやりすぎよ」
「まぁね、でも僕らの家族はそれで食べてるから。半ば
下請けとはいえ、フリーのSEなんて、得意先の仕事を
落とすわけにいかないし。家族としては協力せざるをえ
ないってとこかな」
 実際その通りなので、翔子も強く言えないのだ。
「担任の先生には?」
「もちろん事情は話してる。困った顔してたけど、まぁ
『家庭の事情』だからってことで、納得してくれた。親
父も、今後はできるだけこんなことが無いように努力す
るって言ってたし、それを信じるしかないよ」
「努力、ね」
「そう、努力。確証じゃないけど、そんなもんでしょ?
 それに、相応のバイト代は出してきたから、今回は納
得ということで」
「バイトはいいけど、あんまり無理しないでよ」
 本気で心配する翔子に、巽は肩をすくめる。
「僕は無理するつもり、無いんだけどね。いざとなった
ら体力のほうが大事だから、学校をサボって寝るからい
いよ。………さて、と、これで ver.2.4.2 にアップデー
トできた」
 巽は、Python のバージョンを 2.4.2 にバージョンア
ップしていたのだ。
「基本的に、アンインストールして、インストールしな
おすだけなのね」
「余分なパッケージを導入してなければね。僕の場合だ
と、画像処理用のパッケージとか、マルチメディア用パ
ッケージとか、配布バイナリ作成用パッケージとか、結
構入れてるから、全部入れなおすのは面倒なんだよ」
 ちなみに、画像処理パッケージとは PIL、マルチメデ
ィア用パッケージとは PyGame、配布バイナリ作成用パッ
ケージとは py2exe のことである。
 興味のある方は、それぞれ検索してみて欲しい。
「でも、最初はなんで 2.3.5 を入れたの?」
「………いろいろあったんだよ」
 申し訳ありませんでした(作者)
「これで、日本語とか普通に使えるようになったわけで
………」
「なによ、今まで使えなかったの?」
「いや、使えたけど、日本語化の必要とかあったんだよ」
「バージョンが上がったら、何故使えるようになったの
?」
「Python が、日本や他のアジアの国の文字コードにも対
応したんだよ」
「ふぅん。まぁいいわ」
「というわけで、本日は文字の使い方など、やってみた
いと思うけどいいかな?」
「別にいいわよ」
「じゃ、最初はこれだね、やっぱ……」

        >>> print 'Hello world'
        Hello world
        >>>

「………なにこれ?」
 やや冷めた翔子に対し、巽は澄まして言う。
「これが、かの有名な、"Hello world"のプログラムだよ」
「………有名なの?」
 少なくとも、一般人には有名ではない。
「有名だよ。もっとも、Python みたいな高級言語では、
1行で書けちゃうことが殆どだから、あんまりありがた
み無いけどね」
 言語によっては、ここにたどり着くと一仕事を終えた
充実感に満たされるものもあったりする。
「高級言語って? 言語に高級とか低級とかあるの?」
「まぁ、普通で言う意味の高級/低級とはかなりかけ離
れてるけどね。プログラミング言語っていうのは、人間
とコンピュータハードウェアが対話するための手段なん
だけど、よりコンピュータに近い形の言語を低級言語、
より人間に近い形の言語を高級言語っていうんだ。だか
らコンピュータハードウェアを直接操作したりするプロ
グラムなんかは、低級言語で書く必要があるんだ。人間
が作業をさせるだけなら、高級言語のほうが簡単という
わけ」
「要するに低級言語は職人用、高級言語は一般人用ね」
「そういうこと。Python は、高級言語の中でも
VHLL(Very-High-Level Language 超高級言語) といわれ
るんだ」
 ちなみに最低級言語は、ハンドアセンブルで打ち込む
マシンコードだろうか?
「つまり、高級になればなるほど簡単なんだから、超高
級っていうのは、『幼稚園児でも使える』って意味ね」
「………よ、幼稚園児は、その子が天才少年/少女でな
い限り無理だと思うけど………小学校5・6年生くらい
なら、なんとか使えるんじゃないかな」
 ちなみに、幼稚園児でも使える一種のプログラム環境
は、存在するが、Python はさすがにそこまでは想定して
いない。
「ふぅん、そんな言語を今教えてもらってるあたしって、
バカだってこと?」
 こういう思考が、多くの日本人入門者を難しいプログ
ラミング言語に走らせ、玉砕させる。
「知らない外国語は、大人になっても初歩会話から勉強
するでしょ? それと同じ」
「言葉だもんね」
「そういうこと」
 しかし、言葉かどうかは、議論の余地があるモノでは
あったりするのだが。
「で、何で『こんにちわ世界』なの?」
 なぜだろう?
「C 言語の聖典と呼ばれる『The C programming language』
の最初の例文なんだよ。まぁ、マイクで『本日は晴天な
り』とか言うのと同じかな」
「あっそ。意味無いのね」
「うん、無いよ」
「……………」
「……………」
「……………」
「……………先進んでいい?」
「……………いいわよ」
 無言のプレッシャーを交わしつつ、冷や汗をこっそり
ぬぐいながら、巽は続ける。
「じゃ、進むね。ここで覚えて欲しいのは、文字列は'
(シングルクォーテーション) か"(ダブルクォーテーショ
ン) で囲むっていうこと。どっちでもいいけど、シング
ルで始まったらシングルで終わるように、ちゃんとペア
で使ってね」
「なんで、両方使えるの?」
「例えば、文中でシングルクォーテーションを使いたい
時にはダブルクォーテーションで囲むと、シングルクォー
テーションがそのまま使えるんだ。逆にダブルクォーテー
ションを使いたいときは、シングルクォーテーションで
囲めばいい」
「両方使いたいときは?」
「'\'(バックスラッシュ。日本語では¥マークで表示さ
れることが多いが、本来は'\') に続けて書くと、その
次の文字は特殊文字になって、文字列の区切りとして使
われなくなるんだ。こんなふう」

        >>> print 'Hello \' world'
        Hello ' world
        >>>

「じゃ、'\'を使いたい時は?」
「'\\'って二つ重ねると、一個分に表示されるんだよ」
「………なんか、周到に用意したアリバイみたいに、す
らすら答えるわね」
「まぁ、この程度が文字列で扱えなかったら、プログラ
ムに支障をきたすからね」
「それもそうね」
「ま、いいや。で、文字列も………」
「ちょっと待って。さっきから気になったんだけど、そ
の『文字列』って何?」
「文字の列」
 ジト目で睨む翔子。
「文字の列って、文のこと?」
 巽は首を振る。
「いや、単に文字の羅列。中に意味がなくても一向に構
わないから。原語では String(糸、数珠繋ぎになったも
の) って言うんだけどね」
「まぁいいわ。そういうモノなのね」
「そういうこと。さて、文字列も値だから、変数に入れ
ることが出来るんだ」

        >>> a = 'spam'
        >>> print a
        spam

「あっそう」
「あんまり驚かないね」
「まぁ、関数が入るんだったら、文字列が入ったところ
で、今更」
「そういえばそうか」
 普通は滅多に、文字列より先に関数を習うことは無い
のだが。
「じゃ、文字列を足してみよう」
「足すの?」
「足すの」

        >>> a = 'spiced'
        >>> b = 'ham'
        >>> print a + b
        spicedham

「予想通りね。で、引いたらどうなるの?」
「引けないよ」
「そうなの。意外につまらないわね」
 引いた結果は、足した結果より、直感的にどうなるか、
判りづらいと思うのだが。
「数字を掛けることは出来るけどね」

        >>> print 'spam! ' * 100
        spam! spam! spam! spam! spam! spam! spam!
        spam! spam! spam! spam! spam! spam! spam!
        spam! spam! spam! spam! spam! spam! spam!
        spam! spam! spam! spam! spam! spam! spam!
        spam! spam! spam! spam! spam! spam! spam!
        spam! spam! spam! spam! spam! spam! spam!
        spam! spam! spam! spam! spam! spam! spam!
        spam! spam! spam! spam! spam! spam! spam!
        spam! spam! spam! spam! spam! spam! spam!
        spam! spam! spam! spam! spam! spam! spam!
        spam! spam! spam! spam! spam! spam! spam!
        spam! spam! spam! spam! spam! spam! spam!
        spam! spam! spam! spam! spam! spam! spam!
        spam! spam! spam! spam! spam! spam! spam!
        spam! spam!
        >>>

「なんでいきなり100も掛けるのよ?」
「いや、折角 spam だから、ちょっと多めのほうがいい
かな、と」
「わけわかんない」
 Monty Pythonの有名な『SPAMのスケッチ』参照。
「ま、いいからいいから。次行くよ。文字の中から、番
号を指定して文字を取り出す方法」

        >>> print 'spam'[2]
        a
        >>> a = 'spam'
        >>> print a[2]
        a
        >>>

「'[]'でかこまれた数字は添え字 (index) って言うんだ
けど、これで文字を指定してるんだ」
「2番目の文字って、'p'じゃないの?」
「ちょっと特殊だけど、Python の序数は0から始めるん
だ。だから2番目は実質3番目を指すんだよ」
「変なの」
「うん。だから言語によっては、1から始めるのもある
けどね。これも、0から始めた方がいろいろと都合がい
い場合もあるんだよ」
「どんな場合?」
「たとえば、今は文字列の一文字を取り出したけど、文
字の一部を切り出すこともできるんだ。スライスってい
う指定なんだけどね。これで、例えば前の2文字を指定
しようとすると、こんな風になるんだ」

        >>> a = 'spam'
        >>> print a[:2]
        sp

「確かに、こっちはわかりやすいわね」
「同じく、前2文字『残して』後ろは、こんな風」

        >>> print a[2:]
        am

「じゃ、真中を切りだすときは?」
「後ろから数える場合はマイナスを使うんだ。前2文字、
後ろ2文字を切る場合はこんな風」

        >>> x = 'abcdefghij'
        >>> print x[2:-2]
        cdefgh
        >>>

「面白いわね。ところでちょっと思ったんだけど、『前
2文字切る』じゃなくて『三文字目から後ろ』とか言っ
たら、かえってソレ、難しくない?」
 巽は、少し迷った挙句、『数』についての説明を、少
ししておくことにした。
「その言い方は、例えば 10個のものを3個と7個に分け
るときに、最初から数えていって4番目から別に分ける、
っていうやり方だよね。もちろんそれは正しいのだけど、
その4って、分ける数量とは関係無い数字だよね。実際
その4は、数量じゃなくって序数なんだ」
「序数? 順序数の序数? first とか second の、ア
レ?」
 巽は頷く。
 多分日本人が序数について意識するのは、英語を習っ
た時ではないだろうか。
「数には、序数と濃度の2種類があって、序数は順序を
数えるのに使う数、濃度は数量を表すのに使う数なんだ」
「濃度? 濃さのこと?」
「いや、同じ字を書くけど、溶液の濃さなんかの濃度と
は関係無い。別名、基数とかカーディナル数とか言うけ
ど、とりあえず序数でない量を表す数のことだよ」
 巽は紙に書きながら、説明を加える。

        □□□|□□□□□□□

「文字列の添え字を1から始めると序数的に、0から始
めると濃度的に扱うことになるわけだね。濃度で扱うと、
さっきみたいに 10 を3と7に分けるという過程では、
4という数字は出てこないんだ」
「………難しいわね」
「深く考えると難しいよ。でも、『何文字目』じゃなく
て、『何文字』っていう単位で考えると判りやすいよ。
もっとも、1文字だけを指定するときは、間違いなく面
倒だけどね」
「トレード・オフってこと?」
「まぁ、そういうモノだよ。というわけで、それはそれ
ぐらいにして、スライスの指定には、他にももうちょっ
と面白いのがあるんだ」

        >>> s = '01234567890123456789'
        >>> s[::2]
        '0246802468'
        >>> s[1::2]
        '1357913579'
        >>>

「何が起こってるわけ?」
「判りやすいように数字で書いたんだけど、ちょっと見
づらいかな? スライスの2個目のコロンの右の数字は、
『いくつおき』っていう意味なんだ。全部書くとこんな
風かな

[前から切り捨てる個数:前から残す個数:何個に1個(前から)]

例えば、s[5:10:2] なら、『前から 10 文字を取り出し、
その 10 文字の前から 5 文字を捨て、2個に1個づつ、
最初から取る』っていう意味になるんだ。実際やってみ
よう。

        >>> s = '01234567890123456789'
        >>> print s[5:10:2]
        579
        >>>

まず、真中の『10』で、'0123456789'の 10個が取り出さ
れ、左側の『5』で'01234'が切り取られて'56789'が残る。
ここから2個に1個。即ち1個置きで'579'が残るってい
う寸法だよ」
「………面倒ね。マイナスだと、もっとややこしそう………」
「マイナスだと、こんな感じかなぁ(もちろん、プラス
と混在できるけど)

[後ろから残す数:後ろから切り捨てる数:何個に1個(後ろから)]

だから、さっきと同じものをマイナスで書こうとすると、
こんな感じになるね」

        >>> s[-15:-10:2]
        '579'
        >>>

「最後がマイナスじゃないじゃない」

「マイナス指定を三つ続けると、どうもちゃんと動かな
いみたいなんだ。最後のマイナスは、単独で使うとどう
なるか判りやすいよ」

        >>> s[::-1]
        '98765432109876543210'
        >>> s[::-2]
        '9753197531'
        >>>

「………逆順と、逆順一つ飛ばし、ね」
「ま、そんな感じ。だから、こんな遊びもできる」


        >>> print 'LIVED'[::-1]
        DEVIL
        >>>

「『悪魔(DEVIL)は生(LIVED)への反逆』ってヤツね」
「連続して、ホラーねた」

        >>> print 'ALUCARD'[::-1]
        DRACULA
        >>>

「アルカードはドラキュラのアナグラム? マニアック
ね。ところで、折角日本語使えるのに、日本語はやらな
いの?」
「いいよ、やってみて」
「う〜ん、何にしよう。あ、俳句とかどうかな? 『夏
草や兵どもが夢の跡』」
「いいよ、やってみて」

        >>> b = '夏草や兵どもが夢の跡'
        >>> print b[::-1]
        ユ昔ご蓑もどぜ補p惰
        >>>

「な、何よこれ? メチャクチャじゃない」
「まぁね。実は、アルファベットや数字ばっかいじって
たのは、実は String っていうのが、1バイト文字列だ
からなんだ」
「1バイト文字列?」
「うん。英語の ASCII コードから発展した ISO コード
の基本は、1文字を1バイトっていう情報単位で記録す
る方法なんだ。ところが、この1バイトって、基本的に
256 種類しか文字を識別できないんだよね。だから日本
語コードは、1文字2バイトで表してるんだ。よって、
それを1バイト毎に逆さにすると、文字としてばらばら
になっちゃうんだよね」
「………ちょっと意味わかんないんだけど」
「う〜ん、たとえば、今の『夏』は 16 進法で [89C4]
で表されるんだ。で、これを、1バイト毎、つまり
[89][C4] に分けて、さかさまにするから [C4][89] にな
って、全然違う文字になるっていうわけ」
「つまり、逆さにするなら、2バイト分、一緒に扱わな
いとダメってこと?」
「そういうことだね」
「じゃぁ、日本語の文字を反転とか、出来ないの?」
「出来るよ。こういう時はマルチバイト文字を扱う
Unicode 文字列を使うんだ」
「ゆにこーどもじれつ?」
「まぁ、実際には、クォーテーションの先に u をつける
だけだよ」

        >>> print u'夏草や兵どもが夢の跡'[::-1]
        跡の夢がもど兵や草夏
        >>>

「あ、反転した」
「いちど普通の文字列にしちゃったものは、こうやって
Unicode 文字列にするんだ」

        >>> print b
        夏草や兵どもが夢の跡
        >>> ub = unicode(b,'shift_jis')
        >>> print ub
        夏草や兵どもが夢の跡
        >>> print ub[::-1]
        跡の夢がもど兵や草夏
        >>>

「シフトJISって?」
「文字コードの一種だよ。日本語コードは何種類かあっ
て、その中でも一番良く使われてるのが、Shift_JIS コー
ドなんだ。もともとは、日本でパソコンが普及する前に
流行ったワープロ専用機のための文字コードなんだよ。
もっとも、ISO のコードと併用するとよく誤作動を起こ
すのでも有名で、インターネットなんかで使うと、トラ
ブルの元になったりするから、気をつけた方がいいけど、
日常では圧倒的に使用率が高いからね」
「他にはどんな日本語コードがあるの?」
「う〜んと、JIS X 0208,日本語 EUC,ISO-2022-JP,JIS
X 0212,EUC-JP,ISO-2022-JP-1,ISO-2022-JP-2 ってとこ
かな。あと、日本語だけじゃなく、世界中の言語を扱う
コードとして、Unicode と ISO 10646 があるよ」
「ずいぶんあるのね(汗)」
「実際によく使われてるのは、Shift_JIS と EUC-JP と
Unicode かな? Windows や Macintosh のワープロなん
かでは Unicode が、テキストでは Shift_JIS が、Linux
なんかの UNIX 系では EUC-JP がよく使われてるよ。ち
なみに一時期『e-mail では Shift_JIS でなく JIS(JIS
X 0208 のこと) を使おう』っていわれてたけど、今はど
うかなぁ?」
「あたしは知らないわよ。それより、ユニコード文字列
って Unicode のためにあるの?」
「基本的にはそうだね。次期メジャーバージョンでは、
Python の文字列は基本的に Unicode が基本になって、
1バイトづつを扱う、いわゆる『バイトコード』は別の
型が使われるようになる予定なんだよ。ただ、現在では
String は実質上バイトコードだし、ユニコード文字列は、
マルチバイト、つまり2バイト以上の文字列を扱うため
の型として使えるんだ」
「……………ぁ、限界………。結局、最低限、覚えとか
なきゃならないことは何?」
 聞いたのは自分だろう、と言いながらも言い返せず、
巽はまたため息を洩らす。
「そうだね、日本語を文字として扱う時は、クォートの
前に u を書いて Unicode 文字列にすること。それから、
モジュールに日本語を使うときは、最初にこう書いてお
かなきゃならない。

# coding:shift_jis

'#'は、本来コメントに使うんだけど、これはかならずフ
ァイルの最初の1行目の1文字目から書く規則になって
るんだ」
「それだけでいいのね、簡単じゃない。あんた、クダク
ダと余計なこと言い過ぎよ」
「い、一応大事なことだから、今理解できなくても、説
明しとこうと思って………」
「理解できなきゃ意味ないでしょ。それに、理解できて
なきゃ忘れるわよ」
 巽は、反射的に反論しかけて、それから少し考えた。
 そして頷く。
 覚えるのは、翔子なのだ。
 翔子が今理解できないものを話しても、確かに意味は
無い。
「わかった。じゃ、とりあえず今日は、文字列について
基本的なトコ、押さえとこう。さっき文字列の中でクォー
トを使う時に'\'を使ったの、覚えてる?」
 翔子は手元のメモを見て答える。
「そうだったわね」
「『\'』『\"』『\\』みたいに、最初に'\'がついて、実
質2文字以上で表される文字を、エスケープ文字ってい
うんだ。エスケープ文字には色々あるけど、とりあえず
改行を示す『\n』や、タブスペースを示す『\t』の二つ
は、覚えておいてね」
「改行とタブは、エスケープ文字を使うのね。わかった
わ。でもそれって、改行が多い文を書く時って、面倒く
さく無い?」
「そうだね、改行を含む文字列は、トリプルクォートが
つかえるよ」
「とりぷるくぉーと?」
「まぁ、打って見せたほうが早いかな?」

        >>> spam = '''spam
        ... spam
        ... spam
        ... and
        ... egg'''
        >>> print spam
        spam
        spam
        spam
        and
        egg
        >>>

「改行、できてるわね。シングルクォート三つで、トリ
プルクォートね」
「いや、ダブルクォート三つでもいいんだけど」
「それ、トリプル (triple) じゃなくて、セクテュプル
(sextuple) じゃないの?」
「セクテュプル? なにそれ?」
「六倍」
「細かっ!」
 翔子はメモ用紙に、ついついっと単語を書き並べた。
「ちなみに、

        1倍    single
        2倍    double
        3倍    triple
        4倍    quadruple
        5倍    quintuple
        6倍    sextuple
        7倍    septuple
        8倍    octuple
        9倍    nonuple
        10倍    decuple

だから、覚えとくと便利よ」
「少なくとも、セクテュプルクォートとは言わないと思
うけど」
「ルーズなのね」
「まぁ、そんなとここだわっても意味無いから」
「でも、ダブルクォートが三つでトリプルクォートって、
妙よ」
 なぜかこだわる翔子。
「そうかなぁ? ダブルクォーテーションもシングルク
ォーテーションも、一文字のクォーテーションマークな
んだから、それが三つでトリプルクォーテーションマー
クでいいと思うんだけど」
 巽のの感覚としては、シングルだろうとダブルだろう
と、1バイト文字に変わりないので、その違いがよくわ
からないのだ。
 なお、携帯電話の文字数制限なども、文字数ではなく
バイト数で書かれているのはご存知だろうか?
「あたしは気持ちが悪いわ」
 こちらが、一般人の感覚に近いのかもしれない。
「じゃ、シングルだけ使えばいいじゃん。どうせそっち
が標準なんだし」
「そうなの?」
「そうみたいだね。Python のテキストでは、普通の文字
列でも、改行入り文字列でも、シングルクォーテーショ
ンが普通使ってあるよ。理由はよくわかんないけど、多
分 101 キーボードだと、シングルクォートはシフトキー
を押さずに打てるから、使いやすいんじゃないかな?」
 なお、巽の部屋のパソコンのうち一台は、101 キーボー
ドを使用している。
 実際、特殊な場合(コマンドプロンプト上で日本語を
打つなど)以外は、101 キーボードでも殆ど支障は無い。
 日本語入力をカナ入力されている方にとっては問題か
もしれないが、そうでなければむしろキートップがすっ
きりしていていい感じだったりする(注:筆者のパソコ
ンも、101 使ってるの、あります)
「101 キーボードのシングルクォートって、シフトキー
押しながら数字の 7 じゃないの?」
「JIS の 108 キーボードはそうだけど、101 は L キー
の右の右に、シングルクォートキーがあるんだ。シフト
押すとダブルクォートになるから、覚えやすいよ」
「日本語ではそこ、コロン(:)ね」
「コロンは、セミコロン (;) のキー+シフトで押せるん
だよ。セミコロンの位置は 101 でも 108 でも同じだか
らね」
「なんでわざわざ、日本語の場合は変えたのかしら?」
「さぁ? ただ、想像するなら、日本人ってあまりシン
グルクォート使わないからじゃない? それより、コロ
ンの方が需要が高いから、シフト押さずに使えるように
したとか」
「そうなの?」
「知らない、想像だから。あ、想像といえば、Python で
シングルクォートのほうを多用するのも、多分 HTML(Web
ページ記述言語) を自動生成するプログラムなんかを書
くと、ダブルクォートで属性を指定したりするから、内
容で使うために、文字列を区切るのはシングルクォート
使うんじゃないかな?」
「そうなの?」
「知らない、想像だから。でも実際、Web ベースのアプ
リケーションの需要って、増えてるみたいだからね」
「なによそのWebベースのアプリケーションって」
「まぁ要するに、Internet Explorer や Netscape
Navigator や Mozilla Fire fox みたいな、Web ブラウ
ザでサーバにアクセスしながら使うアプリケーションだ
ね。Web ブラウザさえ動けば、あとはサーバ側でいろい
ろ処理してくれるから、クライアント側の負担が小さく
なるし、アプリをインストールしなくても Web でアクセ
スするだけで使えるから、今注目されつつあるんだよ」
「………あんた、さっきにあたしの話、覚えてる?」
「………ごめんなさい。えっと………そうだね、Yahoo
ショップの買い物システムとか、Amazon.com のワンクリ
ック売買システムとか、そーいうヤツ」
「e-commerce(電子商取引)だけ?」
「あとは、データベースが有名かな。そもそも WWW はデー
タベースだし、相性がいいんだよ。それから、Web メー
ルや Weblog……俗に言う Blog だね。あれもその一種」
「Pythonも使われてるの?」
「おっと、作者が電波を送ったような、都合のいい質問
だね。勿論、Python はバリバリに動いてるよ。Google
や Yahoo なんかで、実際インターネットサービスプログ
ラムを作るのに使われてるよ」
「え? そ、そうなの? それなのに………なんでこん
なに知られてないの?」
 私が聞きたいです(電波を送った作者)
「知名度はともかく、ネット利用してる人たちは、どこ
かで Python で作ったプログラムの恩恵受けてると思っ
ていいと思うよ」
 その100倍はPerlの恩恵を受けているとは思うが………
「で、文字列の話はどーなったのよ?」
「あとは、文字列の文字数をカウントする len っていう
関数のこと、少し話しておこう」
 ちなみにlenはlenght(長さ)の略である。

        >>> s = 'spam'
        >>> len(s)
        4
        >>>

「日本語でも使えるの?」
「使えるけど、ユニコード指定しといてね。でないと狂
うから」
「ん、じゃ、やってみる」
「うん、やってみて」

        >>> len(u'しずけさやいわにしみいるせみのこえ')
        17
        >>>

「五・七・五で、確かに十七文字ね」
「あと……そうだなぁ、文字コードを調べる ord や、文
字コードから文字を生成する chr は、あんまり普通には
使いどころ無いし、さりとて eval を今教えてもなぁ…
……」
「なによそのエヴァルって?」
「プログラムを実行しながら、プログラムの内容を変更
するような時に使う関数。非常に強力な関数で、使い方
は簡単なんだけど、どう使うのか、多分わかんないと思
う」
「そんなの後でいいわよ」
「ごもっとも………あ、そうだ、raw_input忘れてた」
「ローインプット?」
「うん、キーで打ち込んだ内容をそのまま受け取る関数。

        >>> s = raw_input('文字を入力してください > ')
        文字を入力してください > こんにちわ
        >>> print s
        こんにちわ
        >>>

「何してるかはわかるけど……これって、文字入力に使
うのよね? でも、イコールで普通に代入しちゃえばい
いんじゃない?」
「今みたいな Python インタープリタの時はね。前も言
ったけど、プログラムをちゃんとファイルに書いて実行
することもできるんだよ。じゃ、簡単なの書いてみよう。
これからも使うから、c ドライブに、work っていうフォ
ルダ、作って」
「作ったわよ」
「じゃ、hello.py っていうテキストファイルに、こんな
風に打ち込んで」

# coding:shift_jis

s = raw_input('お名前を教えて下さい \n > ')
print s + 'さん、こんにちわ'

「あ、なんとなく判ってきた」
「じゃ、動かしてみて」
「うん」

C:\>cd work
C:\work>python hello.py
お名前を教えて下さい
 > 大鳥翔子
大鳥翔子さん、こんにちわ

C:\work>
「なるほど、こういうことなのね」
「対話モードのインタープリタは便利だけど、基本的に
はこうやってファイルを開いて使うんだ。ちなみに
raw_input にはもう一つ使い方があるんだ。そのヘビの
アイコン、コマンドプロンプトをわざわざ立ち上げなく
ても、クリックしてもプログラムが立ち上がるから、や
ってみて」
「え? そうなの? すごいじゃん………って、何よこ
れ。名前入力したら、表示される前に消えちゃったじゃ
ない」
「そういうこと。だから、今のプログラムの最後に、
rawa_input() って、付け足してみて」
「受け取る変数は?」
「いらない」

# coding:shift_jis

s = raw_input('お名前を教えて下さい \n > ')
print s + 'さん、こんにちわ'
raw_input()

「あ、今度は止まった………あ、そうか!」
「そういうこと。raw_input で入力待ち状態にしておけ
ば、結果が見られるってわけ。対話型のプログラムで、
ユーザの反応があるまで処理を止めて置きたい時なんか
は、これが使えるんだよ」
「コレ使うと、なんか、ちょっとしたプログラム、書け
そうね。それはそうと、なぜ input じゃなくて、
raw_input なの?」
「input 関数ってのもあるんだけど、こっちは文字列の
内容じゃなくって、実行する式を入力する時に使うんだ。
例えば 1+1 とか、数値とかね。そして、評価された結果
が、返り値になるんだ」
「なるほど、だから『raw(生)』なのね」
「うん、『生で挿入』」
「………下品(怒)」
「な、なぜ?(汗)」

        ☆      ☆      ☆

「さて、文字列については、今日はここまで」
「文字列はもうおしまい?」
「いや、今回意識的に省いたトコが一杯あるから、また
後日やるよ。そろそろ、制御文法の話をしないとまずい
からね」
「難しいの?」
「できるだけ簡単に説明するように、気をつけるよ。そ
れに、昔は制御文法だけでいろんな作業をしてたんだけ
ど、今は最低限度でいいから、大分楽になったと思うよ」
「気をつけてよ。あんたにとって簡単でも、あたしにと
って簡単だとは限らないんだから」
「そうだね。気をつけよう」
「じゃ、ありがとうございました」
「お疲れさま」

        ☆      ☆      ☆

「! ! ! ! !」
 目を開くと、カーテンを通して届く街路灯の光に薄ぼ
んやりと照らされた天井が見えた。
 その青と黒の世界を見るとも無く見ながら、美央はど
きどきしていた。
「な、なんであんな夢を………」
 壮絶に失礼………というよりは異常な勘違いをして恥
ずかしい思いをした昼間のことが、影響しているのは間
違いないだろう。
 でも、考えてみれば、そのこと自体より、それ以降の
ことが頭に残っていたのかもしれない。
 勘違いをした自分をどう見ているのか気になって、巽
と翔子を交互に盗み見しているうちに、ふと、翔子の視
線に気付いたのだ。
 巽は、あいかわらずマイペースにディスプレイを眺め
ながら、気負うでもなく神技のような指さばきでキーを
打っていた。
 そしてその姿を、嬉しそうに見ている翔子の視線に気
付いたのだ。
 美央にはそれにどんな意味があるのか、ちょっと判り
かねた。
 親しい幼なじみを見る目?………うん、そうとも見え
た。
 姉が弟を見るような?………そうとも見える。
 母親が子供を慈しむ目?………なんだか、そんな風に
見えなくもない。
 そして………別の何かにも見えた。
 その別の何かが、美央にはわからなかった。
 いや、もしかしたらわかっているのかもしれないのだ
けど、美央はなぜか、それを考えることを拒否した。
 ふと気づくと、巽が自分を見ていた。
 心臓が破裂した気がした。
 巽は、少し首を傾げると、何を言うでもなく、ディス
プレイに視線を戻した。
 翔子を見つめていた美央を少し訝しんだだけで、他意
はないようだった。
 しかし、その目が、美央の脳裏に焼きついていた。
 そしてさっきの夢だ。
「久しぶりだナ、あの夢」
 夢とはいっても、それは、現実に見た風景のプレイバ
ック。
 桜吹雪の舞い散る入学式。
 その桜に見とれて、ぼぉっとしていて、気がつくと一
緒に移動するはずのクラスメイトはすでに先に歩いてい
た。
 あわてて走って追いつこうとして、その拍子に何かに
つまずいて、派手に転んだ。
 転んだ拍子に紙袋がやぶれて、地面にぶちまけられた
入学書類。
 痛さとあせりにパニック状態になって、頭が真っ白に
なり、呆然と地べたに座り込んでいた。
 気がつくと、ぽんっ、っと紙の束で頭を軽く叩かれた。
「あっちの世界から、戻ってきた?」
 いつのまにか、散乱していた書類はまとめられ、その
少年が差し出す手の中にあった。
 まだ何が起こったのかよくわからず、書類を受け取っ
た時、少年の顔を初めて見た。
 嗤うでもなく、顔をしかめるでもなく、当然のことを
無意識に行っているような表情。
 少年は美央に書類を渡すと、背を向けて歩き出した。
「ついてきて。僕らのクラスのホームルーム、こっちだよ」
 何が起こったか、美央が認識したのは、ホームルーム
の指定された自分の席についてから、しばらくした後だ
った。
 そして、猛烈に恥ずかしくなった。
 少年は、他の誰も気づかなかった美央の転倒に気付き、
一人で取って返して、書類をかき集め、その上ここまで
導いてくれたのだ。
 それなのに美央は、一言も礼を言っていなかった。
 あまりにも当然のことのように振舞う少年の様子に、
自分が礼を言わなければならないことに気づかなかった
のだ。
「くちなわ? 珍しい名前だな。おいっ、くちなわ、朽
縄っ!。いないのかっ!」
 担任の先生が美央の机の横を通り、我に返る。
「おい、起きろ朽縄。大体、入学式から寝るか? フツ
ー」
 先生が身体を揺すって起こしているのは、まさしくそ
の少年だった。
「くち…なわ…くん?」
 美央は、その徹底したマイペースぶりに、思わず頬を
緩めた。
 それが、巽と会った最初の出来事。
 以来ずっと、巽のことを目で追っていた。
 生徒会に入ったのは、前会計の羽島八重の影響だった。
 八重は美央の近所に住むお姉さんで、美央の幼なじみ
でもあった。
 そして、部活にも所属せず、クラスでもなんだかぼぉ
っとしている美央を心配して、生徒会執行部の仕事を手
伝わせ始めたのだ。
 そこで会ったのが、当時副会長だった翔子だ。
 翔子は巽を引っ張り出しに、時々クラスを訪れていた
ので見知っていた。
 最初、姉弟かと思ったが、生徒会で姓が違うことを知
り、聞いてみたら八重と美央と同じように、幼なじみだ
という。
 そして、そのぐうたらな弟みたいな巽を、次期執行部
に引っ張り込むんだ、と楽しそうに言っていた。
 美央も、巽と話す機会が出来ると、ひそかに楽しみに
していた。
 そして、今に至る。
 目論見通り、巽と喋る機会は増え、自分の存在も十分
認識してもらって、何の問題も無い筈だった。
 ところが、今日はなぜか、翔子のあの眼差しが、気に
なって仕方が無かった。
 翔子がどんな目で巽を見ようと、関係が無い筈なのに。
 美央が、自分の中に芽生えた小さな想いに気付くのは、
もう少し後だった。

        ☆      ☆      ☆

 なお、巽に言わせれば「飼い主が犬を見るような目」
と即答するだろう。




<翔子のノート(論より翔子?)>
Lesson 3.
        文字列 (String) はシングルクォート『'』かダ
        ブルクォート『"』で囲って定義する
        囲みに使ったクォートではない方のクォートは、
        文中で自由に使える
        囲みに使ったクォートを文中で使うには、『\』
        を頭につけてエスケープする
        文字列同士の足し算は、連結となる
                'spiced' + 'ham' ⇒ 'spicedham'
        文字列に自然数を掛けると、繰り返しになる。
                'spam' * 5 ⇒ 'spam spam spam spam spam '
        ブラケット (bracket [] のこと) で囲んで添え
        字を書くと、文字を取り出せる。ただし文字は、
        0から数え始めるので注意
                'spam'[2] ⇒ 'a'
        スライスによって文字列を切り出す場合、以下
        のようになる
                'abcde'[2]    ⇒ 'c'(一字指定)
                'abcde'[2:]   ⇒ 'cde'(前2文字切り捨て)
                'abcde'[:2]   ⇒ 'ab'(前2文字だけ切り出し)
                'abcde'[-2:]  ⇒ 'de'(後ろから2文字切り出し)
                'abcde'[:-2]  ⇒ 'abc'(後ろ2文字を切り捨て)
                'abcde'[2:4]  ⇒ 'cd'(前から4文字切り出して、前2文字切り捨て)
                'abcde'[2:-2] ⇒ 'c'(後ろ2文字、前2文字切り捨て)
                'abcde'[::2]  ⇒ 'ace'(前1文字目から、2文字に1文字取る)
                'abcde'[::-2] ⇒ 'eca'(後ろ1文字目から、2文字に1文字取る)
        日本語 (マルチバイト文字コード) 利用は、
        Unicode 文字列を利用
                u = u'こんにちわ'
                u = unicode('こんにちわ','shift_jis')
        改行、タブ等の制御文字は、エスケープ文字
        (escape sequency) で指定できる
                '\n'    改行
                '\t'    タブ
                '\\'    \(バックスラッシュ)
        len関数は、文字列の文字数をカウントする
                len('aiueo') ⇒ 5
        raw_input 関数は、ユーザにキーボードから文
        字列を入力させる

<後記>
「モンティ」と「パイソン」。英語圏の人間は、この二
つの単語がつながることで、かなり男根崇拝的なイメー
ジを抱いてしまう。まず、パイソンという言葉。こちら
は簡単、ニシキヘビのことである。日本人にもイメージ
はつかみやすい。ぶっとい身体を、ヌラヌラと光らせて、
とぐろを巻くニシキヘビの異様な光景は、我々にとって
も男根的なイメージ(それもかなり立派な使い込んだヤ
ツ)を、簡単に喚起してくれる。
 そして「モンティ」とは、第二次大戦の際、北アフリ
カを舞台に繰り広げられた西方戦線で「砂漠の狐」の異
名をとったナチス・ドイツ陸軍将軍ロンメルを破った、
イギリス陸軍元帥バーナード・ロー・モントゴメリー
(Bernard Law Montgomery) その人のみを指す、愛称のこ
とである。
 モントゴメリーという人物は、かなりマッチョで、豪
快な人柄というイメージがあるという。

洋泉社 刊「モンティ・パイソン大全」須田泰成 著

 ………とまぁ、長々と引用してみましたが、イギリス
では当然マッチョやゲイは『男の世界』なわけですが、
なぜか日本では『女の子の世界』だったりします(『腐
女子の世界』でもいいけど)
 とゆーわけで、ちょっとだけそういうネタ入れてみま
した(普段はネタの説明はヤボなのでしませんが、今回
はわかりづらいので)
 さて、いつもいつもながら好き勝手に書いているとお
思いでしょうが、今回はかなりの部分書き直しています。
 まず、講義に関係の無い部分で巽と翔子が妙に盛り上
がって、ヤバげな雰囲気になった(二人とも若い若い)
ので、「選択肢まで戻る」一回目。
 次に、毎度ながらわけのわからんオープニングが、今
回は自分で読み直してもわけがわからなかったので、全
面カットで書き直し。
 さらに、痕跡が残っていますが、じつは ord や chr
のみならず、eval の説明もあったんですが、ご存知の方
はご存知のように、無茶にも程がありますので、ここも
かなり書き直し。
 で、内容が薄くなった分、本来オマケのはずの小説部
分のウェイトが際立って重くなったので、全体を見渡し
たあげく、raw_input 関数の説明(これは実は忘れてい
た)を加えてようやく現在の内容になりました。
 なんというか………身体、もつかな?(汗)