PはPythonのP ---P IS FOR PYTHON--- 02h
BRIDGEKEEPER:
"What is the air-speed velocity of an unladen swallow?"
ARTHUR:
"What do you mean?"
"An African or European swallow?"
橋守り
「荷物を持たないツバメの飛行速度は?」
アーサー王
「なんだって? それはアフリカ産のツバメか? それ
ともヨーロッパ産のツバメか?」
by"MONTY PYTHON AND THE HOLY GRAIL"
0000-0010.関数チャチャチャ
〜勇者の伝説〜
第一章 風の山の聖剣
勇者は、王国に平和をもたらすため、闇の魔王を倒す
べく、旅立った。
魔王を倒すために、勇者は伝説の力を手に入れなけれ
ばならない。
伝説の力を、手に入れるためには、伝説に記された四
つの神器を手に入れなければならない。
四つの神器とは、すなわち、『聖なる剣』『聖なる杖』
『聖なる杯』『聖なる珠』である。
まず勇者は、『聖なる剣』を求めて、風の山へと旅立
った。
途中、信頼できる仲間を得、襲い来る魔物を次から次
へと葬った。
勇者の剣の刃は、度重なる戦いにぼろぼろに崩れた。
それでもなお、勇者は突き進んだ。
ついに、『聖なる剣』の突き刺さる風の山の頂上にた
どり着いた勇者は、万感の思いで剣の柄に手をかけた。
勇者の心に、厳かな声が響いた。
『経験値が足りません』
☆ ☆ ☆
「………」
朽縄巽は、コントローラを置いて、大きく伸びをした。
例え中古とはいえ、一銭でも代金を支払ったゲームで、
このような投げ遣りな台詞が出れば、巽は激怒していた
だろう。
しかし、巽のやっていたのはネットからダウンロード
したフリーのコンピュータRPGである。
流石に代価無しで手にいれたものを罵倒するほど、巽
もキレているわけではない。
とはいえ、『勇者が魔王を倒す旅に出る』という、ベ
タベタな設定にもかかわらず、戦闘バランスもストーリー
展開のテンポも良く、結構楽しめる作りになっているの
で、基本的にはこのゲームを気に入っていた。
近年『なんたら○ク〜ル』というツールが発売された
せいか、やたらとフリーのコンピュータRPGがネット
で見かけるようになったが、秀作に出会う確率は極めて
低い。
そもそもツールの売れ行きに対して完成した作品数が
異様に少ないと噂されるのも、まずはツールや素材をフ
ルに使ったところで、一本の作品を仕上げるのには、大
方の予想をはるかに越える作業が必要だからである。
マップを設定し、キャラを設定し、モンスターを設定
し、魔法を設定し、アイテムを設定し………それからシ
ナリオ、である。
無論マップを除くその他は、デフォルト設定を使えば
良いのだが、そこはわざわざ自作をの道を選んだ者の性
格を考えれば、手を出さないほうが少数だろう。
こうして自滅するユーザが、数多く存在するという。
さらに、頑張って作り終えた一握りのクリエータが、
シナリオの矛盾や動作のチェックが終わる頃には、もう
性も根も尽きかけているにちがいない。
しかし、実は本当に面白いゲームを作るには『ここか
ら』が本番なのである。
作者以外の複数のテストプレイヤー(生け贄、ともい
う)に何度もテストしてもらい、バランスやシナリオの
テンポやバグを、徹底的に洗い出して貰う必要があるの
だ。
これが終わって、はじめて『面白いゲーム』が完成す
る。
最後のテストプレイの部分を省いたゲームが、面白い
ゲームになる確率は、極めて低い。
なぜなら、ゲームは『作った本人』がプレイするもの
ではなく、他人がプレイするものである。
他人の意見を聞かずに素晴らしいゲームがつくれるの
は、一種の天才か、経験豊かなベテランでしかない。
巽が今プレイしているゲームは、時々先ほどのような
頭の痛くなる楽屋落ちが含まれるものの、ゲーム自体は
以外にしっかり作り込んである。
作者はよほどバランス感覚に富んだ者か、あるいは周
囲に屍の山を築くことを恐れぬ勇者か(ついでに友情も
崩壊する可能性が多々あるが)。
さらに言えば複数人数でグループを作って開発したか
(エンドタイトルもヘルプも見ていないのでわからない
が)、あるいは、変名のプロのゲームデザイナか。
「あ、それプレイしてくれてるんだ。嬉しいな」
背後から声をかけられて、巽は振り返った。
そこには、生徒会役員の今期副会長となった、二年の
天美修也(あまみ しゅうや)が、にこやかに微笑みな
がら立っていた。
穏やかを絵に描いたような少年で、良く見ればかなり
端正な顔立ちをしているものの、過度の和み空間が、そ
の雰囲気を『著しく和らげて』いる。
「って、このゲーム、天美先輩の知り合いの方が作られ
たんですか?」
「いや、コレ作ったの俺だよ」
………
「最初だから、勝手がわからなくてね。結構よくある話
になっちゃったけど………」
しかも、処女作かいっ!
「あ、ははは、せ、先輩、このゲーム、誰かにテストプ
レイとか、し、してもらったんですよね」
「いや、生憎そういう知り合いはいなくてね。あ、そう
だ。せっかく知り合いがプレイしてくれたんだ。朽縄く
ん、忌憚の無い意見を聞かせてくれないか」
天才は、そこらへんに転がっているものだったらしい。
「じょ、上出来ですよ。マジ、プロが作ったんじゃない
かと疑ってたくらいで………」
「やだなぁ、誉めすぎだよ」
お世辞じゃねーってばっ(怒)
巽は、理不尽な怒りに、肩を振るわせた。
「文句言ってくれないと、上達しないじゃないか」
………これ以上、上達してどーする(汗)
そう思いながらも、プロの作品をチェックするような
レベルで(そうでないと文句の言い様がない)批評する。
「そうですね。実際、戦闘バランスやストーリーテンポ
は文句つけようが無いですし、シナリオのモチーフも、
使い尽くされてるからってストーリィがお約束ってこと
もないですからいいと思うんですけど、多少楽屋落ちギ
ャグ………ほら、この場面の『経験値云々』なんてのは
ちょっと興ざめかな」
「受けなかった?」
「RPG にギャグが必須っていうのは Wizardry の昔から
の伝統ですけど、システム楽屋オチって難しいんですよ。
よっぽどしない方がいいですね」
「なるほど………ところで君は、Wiz やったクチなんだ」
「一応シナリオ#1〜#5まではやりました。やりこん
だって程じゃないですけど、一通りは」
Wiz やらぬもの、コンピュータ RPG 語るべから
ず。
二人のヲタが、無言で語る。
偏見かもしれないが、やったことの無い人は、シナリ
オ#1だけでもやってみよう。
「う〜ん、身近にこんな凄い後輩が居たなんて。今度か
ら、テストプレイお願いしようかな」
「考査前とかでなければ」
「そりゃそうだ。俺だって考査前には作らないよ」「は
はは、お手柔らかに。えっと、この作品の話に戻ります
が、ストーリィ部分のサブキャラの書き込みとかも凄い
ですしね。いまついて来てる仲間キャラが、気の強い幼
なじみの女の子と喧嘩してとびだしてくるってあたりの
シナリオ、思わず引き込まれてビックリしましたよ」
天美先輩は笑いながら、頷いた。
「特にそこ、君に気に入ってもらえると嬉しいな。だっ
てそのキャラのモデル、君と大鳥さんなんだから」
………
巽は、一瞬周囲が闇に包まれたような気がした。
軽い眩暈を起こしたらしい。
こ、この情けないキャラ、僕なのか?(泣)
先輩が作ったという時点で、気付くべきだったのに、
それでも巽の心は認めることを拒否していたのだ。
「いやぁ、君たちの掛け合いは、いつ観ても楽しいから
ね。そうだ、こんどこのキャラと幼なじみの女の子を主
人公にして、外伝つくろうか?」
やめてください
巽は、心の中でそう絶叫した。
しかしその意図を先輩に伝える前に、もう一人、巽の
席に近づいてきた人物がいた。
「こっちが忙しく仕事してるのに、いいご身分ねぇ、巽」
まるで額に怒りの漫符をつけているかの如く、わかり
やすい表情で、大鳥翔子が巽を睨みつける。
「それも、生徒会室にゲームコントローラ持参? あん
た、何しにきてるのよ、ここに」
余談だが、昔のコントローラはシリアルポートなどか
ら繋いでいたので、ドライバのロードなどが面倒だった
が、現在では USB に接続するだけで大概のゲームに対応
する。
いい世の中になったものである(しかしなぜか PC ゲー
ムは、アダルト以外、廃れかけているが………)
「僕の分の仕事は終わったんだから、いいでしょ」「自
分の分が終わったら、他の人のを手伝うのよ」「そんな
んアリ? 少なくとも効率的には三人前以上は働いてる
はずだよ」
「うん、確かに今までは、会計の仕事が一番重労働で、
みんなで手伝ってたからね。朽縄くんは、休んでてもい
いと思うけど………」
とりなす天美先輩を、睨みつける翔子。
「天美くんは黙ってて。あたしが仕事やってて、巽が暇
してるってのが気に入らないのよ」
「それじゃ、朽縄くんが………」
ぽんぽん、と肩をたたいて、天美先輩を止める巽。
そこには、長年の虐待に耐えた、あきらめの顔があっ
た。「先輩、ありがと。でも、こいつの性格上、絶対引
かないよ。で、翔子? 別にサボってなきゃ、翔子の手
伝いしろってわけじゃないよね」
「あ………うん、そ、そうだけど………」
「じゃ………、木崎、お前の仕事、手伝う」
「え………ええっ?」
記録ノートをタイピングするのに没頭していた木崎美
央 (書記) は、いきなり自分に話を振られてびっくりし
た。
「あ、えっと………いいの? 朽縄くん、大鳥先輩?」
「うっ………う、うん、いいのよ。巽をこき使ってやっ
て」
なんとも言いがたい苦い顔を隠しながら、翔子は笑お
うと努力したが、その顔は見たものに言い知れぬ恐怖を
与える地獄の形相だった。
「気にしないでいいよ。さ、こっちの記録はまだ未入力
だな。じゃ、これ貰うよ」
うろたえる美央をよそに、巽は記録ノートの山をごっ
そりと持っていく。
「あ、そ、そんなに持っていかなくても………」
言いかけて、美央は黙った。
巽が猛然とキーを叩き始めたからだ。
数字を入力しているときも、そこそこ速いかと思われ
たが、そのまま何も考えずに打ち込む速度は、更に神技
がかった速さだった。
「す、すごっ………」
ただただ感心するばかりの美央を見て舌打ちしつつ、
だんだんっ、っと足を踏み鳴らしながら、翔子が自分の
机に戻っていった。
実際、翔子の仕事は確認/承認事項が多く、機械作業
のように手伝うことが出来ないたぐいのものだった。
ゆえに巽の行動は非常に論理的だったにもかかわらず、
翔子の心中は穏やかではなかった。
また、巽が嫌がらせで美央を手伝ったのもわかる。
しかし、単に嫌がらせを返された以上の妙な苦さを、
翔子は感じていた。
その地獄の瘴気のように気まずい雰囲気の中、巽の叩
くキーの音だけが響いた。
☆ ☆ ☆
「今日の講義は関数」
翔子が宣言した。
巽は、唖然として目を白黒させている。
「い、いや、教えるのは僕だから、講義演目は………」
「あたしが必要だから、あんたが教えるのよ」
「モノには順序があって………」
「あたしだけが受ける講義よ。あんたはあたしの言うと
おり、教えればいいよの」
横暴である。
もう、洒落にならないくらい横暴である。
大体、制御構文もロクに知らないうちに、関数などわ
かる筈がない。
今度という今度ばかりは、巽もこの役目を放り出した
くなった。
いや、まてよ………
これは、よく考えてみればいい方法かもしれない。
そもそも、新しいタイプのプログラミングでは、BASIC
の昔ほど、制御構文に頼らずともコードが書けるのだ。
制御構文を持たずに関数だけで書くプログラミング言
語すら存在するのだから、制御構文は絶対必要なものと
いうわけでも無いだろう。
無論、制御構文を全く使わないプログラムはかえって
難しいので、時がくれば話すが、後でも悪くはない。
「わかった。今日は関数の講義にするよ」
翔子は、ふふん、と満足げに鼻を鳴らした。
「で、関数なんて突然言い出したってことは、学校で三
角関数の問題でも出たの?」
「よくわかったわね。三角関数表とか見るの面倒だから、
一発で表示できない?」
「できるよ。じゃ、Python 立ち上げて」
「やっと、役に立つわね、これ」
コンソールを立ち上げて、Python を起動。
「じゃ、僕の言うとおりに打ち込んで」
>>> from math import *
>>>
「コレ、何したの?」
「通常では三角関数は使えないからね。math(数学
mathematics) モジュールをロードしたんだ」
「モジュールって何よ」
「そのままの意味は『単位 (module)』だけど、要するに
プログラムの部品の集まりみたいなものだよ。この math
モジュールには、数学関係の関数がセットで入っている
んだ」
「ふぅん、関数って最初から使えないの?」
「最初から使える関数も結構あるけど、数学関係の関数
は無いね」
「数学関係以外の関数って何よ。関数は数学用語でしょ
?」「だから関数って言っても………」
巽は説明しかけたが、ふと気が変わった。
「ま、関数の説明はともかく、とりあえず三角関数の書
き方、教えとくよ」
「書き方? こうじゃないの?」
巽が何か言う前に、翔子はキーを叩いていた。
>>> sin30
Traceback (most recent call last):
File "", line 1, in ?
NameError: name 'sin30' is not defined
>>>
「なんか文句言ってるわよ。壊れてるんじゃないの?」
『壊れてるのはお前の頭だ』と言いたいのを、巽はこ
らえた。
そう、こうやって失敗を重ねたほうが、結果的には良
いのだ。
例え教えている人間の神経を、金属ヤスリで削る結果
になるとしても、だ。
「か、書き方の規則があるんだよ。関数は、関数名に続
けて丸括弧で囲って引数 (ひきすう) を入れるんだ。引
数ってのは、その関数に入れるパラメータのことで、f(x)
の x みたいなの、だよ。sin の場合は、角度が入るわけ
だね」
「ふぅん、なんか面倒ね」
面倒なのには訳があるんだよ、と言いたかったが、そ
れも堪えた。
その訳の説明を理解するほど、翔子にはまだ予備知識
が無いのだ。
>>> sin(30)
-0.98803162409286183
>>>
「………なんかヘンな数値、出たわよ。あ、そっか、こ
う言うときは print を使うのよね、確か」
>>> print sin(30)
-0.988031624093
>>>
「やっぱり出ないじゃないっ! 絶対壊れてるわ、コレ」
「弧度法」
「え?」
「360度法のディグリー (degree) じゃなくて、弧度法、
ラジアン (radian) だよ。360度法から弧度法に変換する
には、radians っていう関数を使うんだ」
「えっと………じゃぁ、二つの関数を使わなきゃならな
いわけ? じゃぁ、radians で表示させて、それを……
…」
>>> radians(30)
0.52359877559829882
>>>
「………この小数、打ち込むの?」
「打ち込みたい?」
「遠慮したいわね。面倒臭いから」
巽は嬉しそうに笑った。
「そう、面倒臭い。いいね、その言葉」
「あ………そっか、『無精 (Laziness)』」
「その通り。面倒臭いことをコツコツやるような人間は
上達しない。頭使って、体はサボらなきゃダメだ」
「もう、別にあきらめたけど、なんか、日本人の勤勉さ
を根底から揺るがすような科白ね」
「資源の有効利用と思ってもいいよ。頭を使わずに機械
のように働くなんて、人間という万能ユニットが勿体無
いよ」
「はいはい。じゃ、習ったトコで………あ、そうか。こ
の数値って、代入できるのよね」
「うん、勿論、普通に変数に代入できるよ」
「じゃ、こんなのどう?」
>>> x = radians(30)
>>> sin(x)
0.49999999999999994
>>> print sin(x)
0.5
>>>
「最初、print 文忘れちゃったけど、これでいいのよね」
「うん、結構判りにくいのに、よく気づいたね。マジ才
能あるじゃん、翔子」
「へへへ」
「今まで教えたことで考えるなら、文句なしだね」「う
ん………って、これ以上簡単な方法、あるの?」「まあ
ね」
「どうやるのよ」
「そうだね………たとえば、こんなんとか」
>>> print sin(radians(30))
0.5
>>>
「な、なにそれ………ちょっとズルくない? そんなの
できるなんて、知らないわよ」
「もちろん、さっきの翔子が出来なくても無理ないよ。
これが書けるには、プログラムの処理の順序とか、知っ
てる必要があるからね」
「処理の順序?」
「うん、まずこの場合、一番最後に処理されるのは print
文。括弧は内側から処理されるから、まず radians(30)
で弧度法に変換されて、それが sin 関数に渡されるって
いう順番。括弧の内側という順番さえわかってれば、簡
単だよ」
「つまり………関数は処理されると数に変わるから、数
の入るトコには関数書いていいってコト?」
「まぁ、正確には『数』じゃなくて『値』なんだけど、
そんなトコだよ」
「なんかパズルみたいね」
「そうだね。ただし、コレ、あんまりやりすぎると、自
分で何やってたんだか判らなくなるから、一目で見て判
る程度にとどめておいた方がいいよ。翔子がやったみた
いに、変数に入れるやり方のほうが見やすいからね」
「まとめた方が簡単なんじゃないの?」
「う〜ん、でも入れ子が三重とか四重とかになると、流
石にちょっと見づらくなるよ。今みたいに使い捨ての計
算やる時ならともかく、ちゃんとプログラムを別ファイ
ルで記録して実行させるときとか、かなり複雑になるか
ら、あまり無理しないほうがいいと思う」
「あれ? ファイルから実行させるとか、できるの?」
「当然できるよ。ちゃんとした Python はちゃんとした
プログラム実行環境だからね。ただ、そういう長いの書
くのは、もう少し慣れてからでいいと思う。まだ何を書
いていいかわからないと思うし。そうじゃない?」
「まぁ、そうね。でも、言われたとおりに打ち込むなら、
多少長くてもいいわよ」
「意味がわからないもの打ってもしょうがないよ。打つ
なら、ちゃんと後で説明して、すぐ意味がわかるような
ものでないとね。でもまぁ、モジュールは造ってもいい
かな? 後で、ちょっとしたオリジナルモジュール作っ
てみよう」
「モジュールって、math みたいなの?」
「うん」
「作れるの?」
「うん。他の言語では結構厄介だけど、Python ではあっ
けないほど簡単だよ」
Python の特長は多々あるが、その中でもこの『手軽に
モジュールが作れる』という機能は、非常に強力である。
小さなモジュール単位でプログラムを組み上げること
は、プログラムを保守する上で重要な役割を持つ。
また、多人数でソフトウェアを組み上げる際にも大い
に役立つ。
「で、何を作るのよ?」
「そうだね。まずは、360度法対応の三角関数とか、どう?
角度を入れたら自動的に計算できるような sin 関数と
か、ね」
「へ? 関数って作れるの?」
「作れるよ。じゃ、今言った関数を、名前を dsin とし
て作ってみようか」
>>> def dsin(x):
... return sin(radians(x))
...
>>> print dsin(30)
0.5
>>>
「もしかして、関数って、この2行で作ったの?」「う
ん。この2行だけ」
「プロンプト…だっけ?…が、'>>>'から'...'に変わっ
てるわね」
「良く見てるね。その通り。あと、return の行を少しイ
ンデント (字下げ indent) してるけど、これは必ずこう
しなきゃならないものだから、守ってね。でないとプロ
グラムがうまく動かないから」
「2文字分?」
「いや、1文字でもそれ以上でもかまわないけど、とに
かく『ここは直ぐ実行するところじゃなくて、定義部分
ですよ』っていうことを示さなきゃならないから。こう
いうのを『ブロック』っていうんだ。同じレベル……つ
まりこの場合だと、関数定義の部分は、同じインデント
でそろえなきゃならないんだよ」
「関数って、1行で書かなきゃいけないわけじゃないの
?」「いや、別にいいよ。たとえばこの場合、こう書い
ても同じことだよ」
>>> def dsin(x):
... r = radians(x)
... return sin(r)
...
>>>
「これは、あたしの書いた書き方と同じね。ところで、
return って?」
「関数は通常、値を持つのだけど、その値を指定するの
が、この retrun の部分。ここの後ろに書かれてる部分
が、関数の値になるんだよ。このことを『値を返す』っ
て言って、返される値を『返り値』なんて呼ぶんだ」
「返り血? なんだか物騒ね」
「………血、じゃない、値 (あたい) だよ」
「あ、ああ、そうなの」
ボケじゃなかったのか。
「ところで、この関数使うと、x とか r とか、値が変わ
っちゃうの?」
「ん?」
巽は一瞬、何を言われたのか判らなかったが、すぐに
思い当たってぽんと手を打つ。
「ああ、この関数定義に使われる変数のことだね。一応、
この関数定義の中で代入されたりしたものは、関数定義
の外では無効なんだよ。ためしに、今の関数使ってみて、
r っていう変数に何が入ってるか、みてみよう」
>>> print dsin(30)
0.5
>>> print r
Traceback (most recent call last):
File "", line 1, in ?
NameError: name 'r' is not defined
>>>
「なんかエラー出たね」
「これは『r なんていう変数無いよ』って言ってるんだ。
関数定義内の変数は仮引数 (かりひきすう) って言って、
関数定義を書くために仮に使ってる記号(シンボル)な
んだ。だから、定義の外の変数とはあまり関係無いんだ
よ」
「『あまり』? 『全然』じゃないの?」
「うん。さっきの定義で言えば、x は関数を呼び出した
………関数を使うことを、『関数を呼び出す』って言う
んだけど………時点で、その x に代入してることは、な
んとなくわかるよね」
「うん、なんとなく」
「で、r は計算過程で代入してるから、x と r のどちら
も、関数の中で代入されてるんだ。ところで、たとえば
こんな関数も書けるんだ」
>>> def func():
... return b
...
>>>
「なにこれ。引数無いし、そもそも b って何よ」
「うん、引数なしの関数っていうのもあるんだよ。まぁ、
何に使うかはこれから話していくけど、それはそれとし
て、b のこと。じゃ、実際、この関数を呼び出してみよ
う」
>>> func()
Traceback (most recent call last):
File "", line 1, in ?
File "", line 2, in func
NameError: global name 'b' is not defined
>>>
「エラーが出るよね」
「当然よ。b を返せったって、b ってなんだかわかんな
いんだもん」
「そうそう、その通り。じゃぁ、b の内容があったら?」
「え?」
>>> b = 100
>>> func()
100
>>>
「あ、あれ? 関数定義の中の変数は、外と関係無いん
じゃないの?」
「実は、中で決められていない変数が出てくると、関数
は実行されてる環境、つまり『外』を参照するんだ。こ
れを別の言語式に言えば自由生起 (occur free) とか自
由変数 (free variable) とか言うんだけど、まぁ、関数
の中で定義せずに後から定義するっていう意味だね。た
だし、判ると思うけど、関数を使った時の結果が見え難
いから、こういうことはできるだけしないに越したこと
はないんだ」
「じゃ、中で値が変更されちゃったら?」
「変更されるってことは、代入されるってことだから、
その時点で外の変数とは別物になるってことだよ」
「あ、そっか」
「もっとも global っていうキーワードを使うと外と中
の変数を一致させて、内部で外部の変数の内容を変更さ
せることもできるけど、関数の中で外の変数が知らない
間に変化してるってのは、プログラムを本当にわかりに
くくするから、極力使わない方がいい。変更させるなら、
こうして
a = func()
みたいに、関数の外でちゃんと代入した方が『変更させ
た』ってわかりやすいからね」
「なるほどねぇ………わかったようなわからないような
………」
少し混乱しかけている翔子に、巽はさらに追い討ちを
かける(わざとではないのだが)。
「なんて言ってる僕も、実は外の名前を使ってたりする
んだけどね。関数の中に sin とか radians とか使って
るけど、これ、関数の外で定義されてなきゃ、いきなり
使えないからね」
「関数名と変数は別物でしょ?」
「普通はそうだよ。でも Python では、実は似たような
モノだったりするんだな、コレが」
「どういうこと? 変数は変数でしょ?」
「例えば、こんなこととか、出来たりして」
>>> s = sin
>>> r = radians
>>> print s(r(30))
0.5
>>>
「な、なにこれ? 何が起こったの?」
「前回言わなかった『代入』のことなんだけど、実際は
『代入』っていうのは原語で"assignment"といって、直
訳するなら『指定』ってとこかな。実際やってることは、
右辺の内容に左辺の『名札』をつけてるだけなんだ。だ
から、数値に名札をつければ、代入みたいに使えるし、
関数名に名札をつければ、別の関数名として登録できる
ってこと。最初に書いた import 文も、実際は名札付け
作業なんだよね。だから、関数定義の中で外の関数名を
参照してるのも、原理は全く同じなんだ」
「………ちょ、ちょっと混乱してきたわ」
「うん、ゆっくり理解すればいいと思うよ。今日は、モ
ジュールを作って終わろう。一旦 Python を終了させて、
コンソールも閉じて」
「判った」
「じゃ、c:\Python23\Lib のフォルダを開いて」
「………なんか、蛇っぽいアイコンが沢山………そうい
えば、インストールの時も蛇が………」
「だって、Python ってニシキヘビのことだもん」「うわ
………あ、あたし、蛇が特に苦手ってことは無いけど、
あんな大きいのはちょっと………」
「いや、別にプログラムには関係無いから」
「あ、そうなの」
「まぁ、Python の本の表紙は、ニシキヘビが書いてある
ことが多いけどね」
「………それって、女の子がテキメンに嫌がるわよ……
…」
「そう? 爬虫類はペットとして優秀なんだけどなぁ…
……ボールパイソンとか、癒されるっていって人気高い
し」
「どう思おうとあんたの勝手だけど、女の子がみんな蛇
好きだと思いこんでたら、そのうち大顰蹙買うわよ」
「そうなの?」
「嫌いな子の方が、圧倒的に多いと思うわ」
「翔子は?」
「私は、毒があったり呑み込まれたり絞め殺されたりし
なければ、別に構わないけど」
「ふ〜ん。まぁいいや。ともかくそのフォルダに、テキ
ストファイル作って」
「右クリックメニュー?」
「ウィンドウメニューからでも、別にいいけど。作った
ら開いて、中に、こう言う風に書いて欲しい」
# dmath.py
import math as _m
def sin(x):
return _m.sin(_m.radians(x))
def cos(x):
return _m.cos(_m.radians(x))
def tan(x):
return _m.tan(_m.radians(x))
「書いたわよ。ところで、このアンダースコア (_) とか
ピリオド (.) とか、何?」
「後で、説明するよ。書いたら保存して、ファイル名を
dmath.py に………って、あれ? 翔子のシステムって、
拡張子、非表示になってた?」
「な、何よ拡張子って?」
「とにかく僕の言う通りに作業して。説明はそれからす
るよ」
巽は翔子に指示して、ウィンドウのツールメニューか
らフォルダオプションを選び、『表示』タブの中の『登
録されているファイルの拡張子は表示しない』のチェッ
クを外させた。
そしてその設定を、全フォルダに適用する。
「わ、なにこれ? ワードファイルの名前とかに、.doc
とか、ヘンな文字ついてる………」
「それが拡張子だよ。Windows の標準では隠されてるけ
ど、これからプログラミングを習うには百害あって一利
なしだから、必ず表示させておいてね。さて、話の続き。
ファイル名を'dmath.py'に変更して」
『拡張子を変更すると、ファイルが使えなくな
る可能性があります。変更しますか?』
「………なんか、エラーメッセージ、出たけど?」「エ
ラーじゃなくて、それアラート(警告)だよ。無視して
いいよ」
「大丈夫なの?」
「大丈夫。名前なんて大したモノじゃない。ただ、Python
モジュールにするには、拡張子を'.py'にする必要がある
から、変更するんだよ」
「変更したよ。メモ用紙アイコンが蛇アイコンに変わっ
たわ」「OK。じゃ、新しいモジュールが使えるかどう
か、Python 立ち上げて、試してみて」
「モジュールの使い方って、さっきと同じ?」
「うん。モジュール名だけ、math から dmath にしてね」
>>> from dmath import *
>>> print sin(30)
0.5
>>> print cos(60)
0.5
>>> print tan(45)
1.0
>>>
「ちゃんと、普通に使えるわね」
「ところで、これで関数を使うのにわざわざ import で
導入しなきゃならない意味、わかった?」
「え? どういうこと?」
「ほら、今は作った dmath モジュールで 360度法版の
sin 関数とか使ってるけど、さっきは同じ sin 関数って
いう名前を、弧度法で使ったよね。こんなふうにモジュー
ルを分けておけば、場合に応じて同じ名前が違う意味と
して使えるんだ」
「両方いっぺんには、使えないの?」
「使えるよ。もちろん同じ名前は使えないけどね。モジ
ュール本来の基本的な使い方、やってみよう」
>>> import math
>>> print math.sin(math.radians(30))
0.5
>>>
「全部頭に matn.ってついてるね。もしかしてこのピリ
オドって、『〜の』っていう意味?」
「うん、そう考えるのが一番いいと思う。
from 〜 import *
の構文は、『〜モジュールの中の全ての名前を導入しな
さい』っていう意味だけど、
import 〜
は、『〜モジュールという名前を導入しなさい』ってい
う意味なんだ。だから今回の場合、名前として導入され
たのは、math だけで、あとは math モジュールの『中の
もの』としてとりあつかってるんだ。ちなみに、
from-import の最後のアスタリスクは『全部』の意味の
省略形で、本来は、
from math import sin,cos,tan
なんて形で、モジュールの中の名前を選択して使えるん
だよ」
「う〜、ちょっと頭がごちゃごちゃ。ノートでも取っと
いたほうがいいかな?」
「テキストファイルで、メモしとけば? 書き直しも書
き足しもできるし」
「そうしとく。ところで、さっきから『名前』って言っ
てるけど、『関数』じゃないの?」
「うん。もちろん関数もそうだけど、変数だって導入で
きるからね。たとえば math モジュールには、pi ってい
う変数が入ってる」
>>> import math
>>> print math.pi
3.14159265359
>>>
「変数? πは定数じゃないの?」
巽は、気まずそうに頭を掻いた。
「そうなんだけどね。πとかeとか、定数なんだけど、
Python では基本的に定数ってのは作らないことにしてる
んだ。Python での定数は、言語として予約されてるもの
だけに限られてる。例外中の例外として'None'っていう
のがあるけど、これは予約語になってる」
なお、将来的には True と False も予約語になる予定
であるが、2.3.5 現在はまだ変数である。
「予約語以外の名前は、関数名を含めて基本的に全て変
数なんだよ。試しに、math.pi に数値を入力してみよう」
>>> math.pi = 3
>>> print math.pi
3
>>>
「要するに、機械の都合ね」
「言語を使う人の都合だよ。ともかく、モジュールの変
数を使うなら、使う直前にモジュールを呼び出したほう
が確実だね」
「ま、仕方ないわね」
「最後に一つだけ。モジュールの中で使ったんだけど、
モジュールを import する時に、名前が長い場合なんか
は、as キーワードを使って名前を変えて import するこ
とができるんだ
import math as m
は
import math
m = math
del math
と同じだよ。あ、del っていうのは、名前を消す文だよ」
「さっきのモジュール、名前を m じゃなくて _m にして
るわね。これ、なんか意味あるの?」
「アンダースコアで始まる名前は、from-import* では名
前が導入されないんだ。モジュールの中だけで使う名前
なんかに使うんだよ。いらない名前まで導入されちゃう
と混乱するからね」
「その名前は、モジュールの外からは使えないってわけ
?」
「from-import* 構文で使えないだけだよ。import でモ
ジュール名を指定して、モジュール名からたどれば使え
るし、from でちゃんと名前を指定すれば使えるよ。要す
るに、モジュールを正規の方法でただ使うだけの人を混
乱させないための予防策だからね。外からは使わせない
為の機構は、 Python には無いよ」
「ね、それってセキュリティ、大丈夫なの?」
「言語仕様とセキュリティは、基本的に関係ないよ。言
語仕様によるアクセス制限は、主にモジュールを呼び出
して使うプログラマに対して使用方法を制限することに
よって、モジュールを製作者の目的どおり安全に使わせ
るためにあると思う。それはそれで一つの考えなんだけ
ど、Python 言語の考え方としては『警告はしました。無
視して危険を冒すなら、自己責任でどうぞ』ってとこか
な」
「無責任ね」
「まぁね。でも、機械をいじって壊すのも、勉強になる
と思わない? ソフトウェアなんて、壊れてもバックア
ップしとけばすぐ直るし、システムをクラッシュさせる
ようなことは、滅多にならないしね」
「滅多にって?」
「意図して壊すつもりでいろいろ調べてやれば、壊せる
よって程度。Python を使ってる限り、偶然や間違いで壊
れるってことはまず無いよ」
「それなら………いいのかな?」
「アクセス制限に関しては、将来他人の使うプログラム
モジュールを書いた時に、考えるべき問題だよ。自分し
か使わないプログラムに、アクセス制限したって意味無
いからね」
「それもそうね。それにあたしの場合は、壊しても巽が
直してくれるし」
「まぁ、大体のことは………」
「大体って、そっちはかなり無責任よ。プログラミング
でデータ破壊されたら、ちゃんと直しますって保証して
くれなきゃ」
「えっと………大概のことは大丈夫な筈なんだけど、た
まに Windows って、予想不能の動作するからなぁ………
その引き金がプログラムで起こらないとは言えないし」
「え? そんなに危険なの?」
「プログラミングすることより、Windows を使ってるこ
とのほうがかなり危険だと思うよ。日本政府も最近は、
Microsoft の OS の寡占状態に危惧を抱いてて、順次
Linux 系 OS に変えるみたいだし」
「それじゃ、今Python覚えても意味ないの?」
「Word の打ちかた覚えるよりずっと意味あるよ。Word
は Linux で動かないけど、Python は Linux でも Mac
でも動くからね」
「それなら安心。折角覚えたのに、使えなくなるなんて
バカみたいだし」
「1-2-3 のマクロの達人とか、VzEditor のマクロ師の方
とか、今でもそういうの、使ってるんだろうか………」
余計なお世話である。
しかし、同じマクロ師でも、Emacs のマクロ師は時代
を超えて健在である。
フリーウェアは強し。
☆ ☆ ☆
コンストリクタ:
「おい、オメーなんだその格好は?」
シムーグ:
「あんたに、ついてくのよ。悪い?」
コンストリクタ:
「悪いに決まってんじゃねーか。遊びに行くんじゃ
ないんだぞ」
シムーグ:
「あんたが行けて、あたしが行けないわけないでし
ょ、バカにしないで」
ハーキュリーズ:
「シムーグ、君は戦えるのか?」
シムーグ:
「基本的な攻撃スペルなら、一通り使えるわ。雑魚
相手の体力消耗は、かなり防げるはずよ。あと、能
力や武器の強化系呪文も使えるから、スペルが直接
効き難い大物相手でも手持ち無沙汰にならない筈よ」
ハーキュリーズ:
「わかった。コンスト、彼女を連れて行こう」
コンストリクタ:
「正気か、ハーキィ?」
ハーキュリーズ:
「もちろん正気だ。我々の旅にはスペルの使い手が
もっと必要だ。モンクの君の一撃必殺の拳は確かに
強力だけど、僕の剣と君の拳じゃ、大勢の敵相手に
は効率が悪すぎる」
コンストリクタ:
「オレは反対だ。その女の気まぐれにつき合ってた
ら、こっちの命がいくらあっても足りねぇ」
シムーグ:
「何が気まぐれよっ!」
コンストリクタ:
「前にオレがここから出てった時には、行くならオ
レを殺すとか息巻いてたじゃねーか。なんで今度は
ついてくんだよっ!」
シムーグ:
「あんたがあたしの言うこと、聞かないからでしょ
っ! なんでそんなことも、わかんないのよ」
コンストリクタ:
「どーいう意味だよ」
シムーグ:
「それでわかんなきゃ、もうあんたに説明する言葉
なんて無いわ」
コンストリクタ:
「このアマっ!」
シムーグ:
「なによっ!」
ハーキュリーズ:
「やめろって。ともかく、シムーグは連れて行く。
いいね」
コンストリクタ:
「けっ、勝手にしろ。でもオレは、その女が殺され
かけても、助ける気はねーぞ」
シムーグ:
「あんたに助けられるほど、落ちぶれてないわよ。
ハーキィ、あたしのことはシムって呼んで。以後宜
しくね」
***シムーグが仲間に加わった***
---P IS NOT PYTHON?--- 02h
今回から二本立て。
<翔子のノート(論より翔子?)>
LESSON 0
Pythonの公式サイトは
http://www.python.org/
ダウンロードするファイル
Python-2.3.5.exe
LESSON 1.
インストールされるデフォルトフォルダ
c:\Python23
環境変数PATHの設定の仕方
Windows 9x 系 (Windows 95,Windows
98,Windows Me) の場合
autoexe.bat というファイル
の末尾に"path=%path%;c:\Python23;"を追加
Windows NT 系 (Windows NT,Windows
2000,Windows Xp)
『マイコンピュータ』(右クリックメニュー)
→『プロパティ』
→『システムのプロパティ』
→『詳細設定』
→『環境変数』
『ユーザ環境変数』のPASHを編集
末尾に";c:\Python23"を加える。
Pythonインタープリタの起動
コマンドプロンプトから、> python
数式(式 expression)の評価
数式を打ち込んでEnter(値が表示される)
数式の表示(特に実数:浮動小数点数の表示)(print文)
print 式
四則演算子
+ - * /
割り算の注意(ver.2.3.5現在)
整数 / 整数 → 整数(切り捨て)
実数 / 整数 → 実数
整数 / 実数 → 実数
値の代入(代入文)
変数 = 式
代入演算子
x += a ← x = x + a
x -= a ← x = x - a
x *= a ← x = x * a
x /= a ← x = x / a
比較演算子(代入文)
> 大なり
< 小なり
>= 大なりイコール
<= 小なりイコール
== イコール
!= ノットイコール(イコールではない)
一気に代入
x, y, z = a, b, c
内容交換
x, y = y, x
文と式の違い(1)
意味の違いではなく形式の違い
現在出ている文は代入文とprint文のみ
ターミナル
コマンドプロンプトのように、文字を
打ち込んでコンピュータに命令するア
プリケーション
ディレクトリ
フォルダの古い言い方。ターミナルで
作業をする場合、「どこで実行するか」
が問題になるので、コマンドを実行し
ている場所を「カレントディレクトリ」
と言う。
LESSON 2.
※object は、名前と値のあるものの総称(数値、
式、関数など)
関数(function)の使い方
func_name([arg1,arg2..])
x = func_name([arg1,arg2..])
※argは引数(argument)
[] 内はオプション(有る場合も無い
場合もある)
関数は値に置き換えられる
関数は括弧の内側から評価(計算)される
モジュール(module)の導入(import文)
from モジュール名 import *
import モジュール名
from モジュール名 import インポートしたい関数や値など
関数の定義(define,definition)の仕方(定義文)
def 関数名([引数1,引数2..]):
[文]
return 返り値
モジュールの置き場所
c:\Python23\Libの中が一般的
拡張子の非表示の解除
ウィンドウの『ツール』メニュー
→『表示』タブ
→『登録されているファイルの拡張子は表示しない』チェックを外す
モジュールやオブジェクトを特定の名前で導入する(導入文)
import モジュール名 as 使う名前
from モジュール名 import 関数などの名前 as 使う名前 [,関数などの名前2as 使う名前2]
削除文
del 変数や関数名など
文と式の違い(2)
式は値と入れ替わるので式の中に組み込めるが、文は式に組み込むことは出来ない
今回出た文
import による導入文(import文)
def による関数定義文
del によるオブジェクト削除文
<後記>
というわけで、オマケ部分の書き方を変えて実用的に
してみました。
さて、今回使った math モジュールですが、Lib フォ
ルダの中のどこを探しても見つからないと思います。
実はこれ、Python本体の python23.dll(system32 フォ
ルダ内にあり) の中に入ってたりします。
他言語ではモジュールの導入は、文字通り外部に存在
するライブラリであるモジュールファイルを読み込む為
に利用するのですが、Python ではどちらかというと「名
前を導入」するという意味合いのほうが強くなります。
Java では Python より手順が一つ少なく、何の宣言も
無しにモジュール名からクラス名を指定するとそのクラ
スが使え、import するとフルパスから逃れられます。
つまり、フルパスで使う名前は常時利用できる状態に
なっているわけです。
また、Perl などは常時使える関数が多いので、特にモ
ジュール導入せずともかなりのことが可能です。
Smalltalk にいたっては、殆ど自作でオブジェクトを
設計せずとも、用意されているパーツを組み合わせれば、
殆どの部分は出来てしまいます。
このように、常時使える名前が多いというのはある意
味便利ですが、反面、把握しておくべき名前が煩雑に散
らかっている状態とも言えないことはありません(Java
や Smalltalk などはオブジェクト単位にまとめられてい
るので、一概にそうとは言えないのですが)
Python は、このような言語から見ると異様なほど、最
初から使える関数 (機能) は制限されています。
文法に正規表現が組み込まれている Perl などから見
れば、re モジュールを import しないと正規表現すら使
えない Python は、まどろっこしい言語なのかもしれま
せん。
ただし、初期機能が限られているということは、初期
状態での全ての機能を把握することは比較的簡単だ、と
いう意味でもあります。
また、モジュールの書き方が単純そのものなので、ど
んどん自分で機能を追加していく楽しみがあります。
趣味の問題でもありますが、私は Python のこういう
半ハンドメイド的なところが気に入っていますし、プロ
グラミングの入門用や (私のような)日曜プログラマには
ぴったりだと思っています。
さて、前半でついアツくなってしまったのが、RPG の
話題。
このブログの類別を見て貰えば一目瞭然ですが、私は
RPG マニアです。
特に自作についてはいろいろあるので、いずれこの講
座の深い部分に食い込んでくる予感がします(興味の無
い方、ごめんなさいね)
Wizardry に関しては、ただのファンならともかく『RPG
を語る』なら、一度はやって下さい。
ちなみに、知る人ぞ知るですが、MONTY PYTHON と
Wizardry も、少なからぬ関係があったりするんですけど
ね。
テストプレイ云々は、ソフトウェア全般に言えること
だと思います。
いろいろな意味で運用テストは開発と同じくらい大事
です。
<追補 Python2.4.2用設定>
Python2.3.5 がインストールしてある場合、アンインス
トールする。
ダウンロードファイル
Python-2.4.2.msi
デフォルトインストールフォルダ
c:\Python24
環境変数PATHの設定の仕方
Windows 9x系(Windows 95,Windows 98,Windows Me)の場合
autoexe.batというファイルの末尾に
"path=%path%;c:\Python24;"を追加
Windows NT系(Windows NT,Windows 2000,Windows Xp)
『マイコンピュータ』(右クリックメニュー)
→『プロパティ』
→『システムのプロパティ』
→『詳細設定』
→『環境変数』
『ユーザ環境変数』のPASHを編集
末尾に";c:\Python24"を加える。
※アップし忘れてました(機械)