2010年9月5日日曜日

プログラムの中身を書く--メソッドを書いてみましょう

メソッド、関数を書くというのは、まあよくメソッドを定義する、なんて言い方をされますが。
ある種業界用語なので、まあ、そんなもんなんだ、くらいに思ってもらえばいいのかな、とか思いますが。
何も定義なんて、カッコいい言い方をしなくても良さそうなもんですが、ワタクシなんぞは業界が長いので、もはや定義と言った方がしっくりくるので、ここでも、「メソッドを定義する」とかカッコ良く言ってみたりします。

では、メソッドを定義してみましょう。(笑)

メソッドを定義する


Pythonでメソッド/関数を定義する場合には、以下の書式となります。

def メソッド名(self,引数):
    メソッドの中身…

これは、ハンドラの部分でも出てきたので、まあ、そう書くのだな、というのがすでに解っているかも知れません。
#解っていないかも知れません。(笑)

とはいえ、これはPythonの場合、イヤだと言っても言語仕様で、そう書くのが定められているので、もはや逃げ道はないのです。(笑)
仕方ないので、defから始めましょう。
#defはdefineの略で「定義する」 ってことです。

メソッド名は、変数名と同様に、実は大変重要なものです。
解り易い名前を付ける必要があります。
例えば以下のような名前でしょうか。

def push_leftChikubi():

このように書いておけば、後から見たときにも、「ああ、左の乳首を押された時の動作なのだな」とすぐに解ります。(ぉ
長すぎるのも良くないので、ある程度コンパクトにまとめるのが吉でしょう。

引数ってなんぞ?


ちなみに「ひきすう」と読みます。まあ、読み方なんてどうでもいいじゃん、とか思うんですが、なぜか「引数」は「ひきすう」と読むことになってますので、そう読みましょう。
#なんで湯桶読みなんでしょうね。

パラメータなんていう言い方もしますね。
そのメソッドが呼び出されるときに必要な情報として与えられるものが引数ということになります。
メソッドのアクションを実行するときに必要な「値」なので、パラメータなんでしょうかね。
メソッドの場合には、必ず最初の引数は、自分の属するクラスを表すパラメータ「self」になります。
NetBeansでクラス内にメソッドを書くと、自動的に提案してくれるので、そのまま適用してしまえば、いちいちselfを入力することもないので助かります。
専用環境というのは、このような補完が効くので、非常にラクと言えましょうか。
まあ、普通のテキストエディタでも書けるようなレベルでしかないんですが、いまのところ。
巨大なアプリケーションを作成する場合には、効率面で効いてくるような点でしょうか。

余談になりましたが。(笑)

シグナルハンドラの場合には、selfと同時に、widgetも指定します。
これは、シグナルハンドラの時に触れましたが、シグナルを引き起こしたGTKウィジェットを受け取るためです。
シグナルによっては、他の値が引数として渡ってくることもあります。
この辺が詳しいでしょうかね…と思って探してみたら、まとまってるとこないな。
個々のGTKウィジェットによっても違うので、GTKリファレンスの方に記載があると思われますが。
ま、あんまし使うこともないので、必要になったら調べる、程度の考えで問題ないと思われます。
#てか、知らないってことは使ってないんだよ。(笑)

その他にも、シグナルハンドラ以外にクラス内にメソッドを定義する場合があります。
その場合に、引数を指定する場合があります。
先程の例で行くとこんな感じでしょうか。

def push_leftChikubi(self,push_type):
    指で押された
    舌で押された

左乳首を押された場合の押された種類をpush_typeという引数に入れてメソッドを呼び出すことで、push_leftChikubiのアクションを変えることが出来るわけです。

制御文


引数でアクションを変えることができる、という話をしましたが、そのように関数やメソッド内部で、プログラムの実行順番を制御することを制御文といいます。
制御文は大きく分けると、「分岐」と「ループ」になりますか。
#他になんかあったかな?

まずはよく使うと思われる、分岐の方から。
構文的には、以下のようになります。

if 条件 :
    条件が真だった場合
else:
    条件が偽だった場合

elseはなくてもいいので、よく使う形式としては、if 条件 : 〜の方ですかね。
条件が真だった場合、上限が偽だった場合の部分にインデントが付けられていることに注意してください。
ifの条件を満たしたとき、満たさなかったときに、実行されるブロックも、やはりインデントで区分します。

先程のメソッドを例に取ると以下の感じになります。
#たぶん実行は出来ません。
def push_leftChikubi(self,push_type):
    if push_typ == "指":
        「ああん」という
    if push_typ == "舌":
        「あっ」という

せっかくだから、実行可能な形にしてみると、以下の感じ。
def push_leftChikubi(self,push_type):
    if push_typ == "指":
        print("「ああん」")
    if push_typ == "舌":
        print("「あっ」")

引数に"指"とか"舌"を入れてコールすると、Pythonが喘ぎます。(笑)

ま、与太はともかく。

これで実行時に条件によって処理を分岐させる、ということが可能になります。

ループは「繰り返し」のことです。
同じ処理を何回か繰り返す場合に使います。
ループには大きく二つあり、「決められた回数繰り返す」ものと「条件が真の間繰り返す」ものがあります。
まずは、「決められた回数繰り返す」方から。
forループといいます。
#シャレではなく。

構文的には以下の感じ。
for 変数 in 繰り返すためのリスト:
    繰り返し処理

この場合も、繰り返し処理の部分にはインデントが付けられていて、繰り返しを行う処理ブロックを明確に区分しています。


指定回数繰り返す場合には、組み込み関数であるRangeを使って以下のようにします。
for a in Range(0,10):
    print("「うふふ」")
実行すると、Pythonが「うふふ」と10回言います。気味が悪いですね。(笑)

条件が真である間繰り返す方がwhileというループになり、以下の書式です。
while 条件:
    繰り返し処理

条件の部分を満たしている間ループを繰り返します。
つまり、条件を変更する処理を書き忘れると無限にループすることになります。
注意しましょう。
こちらは例文は記載しませんが、今回はたぶん使わないので。

例によって、詳しくはこちらに記載されています。

というわけで、座学に飽きてきたので、次回は、実際に制御文を使って、実行時に判定をする、ってのを入れてみましょうか。
手を動かさないと飽きるし、そろそろガマン汁もいい感じになってるのではないでしょうか。
とはいっても、乳首関係ないので、変な期待はするだけ無駄です。(笑)

0 件のコメント:

コメントを投稿

'},ClipboardSwf:null,Version:'1.5.1'}};dp.SyntaxHighlighter=dp.sh;dp.sh.Toolbar.Commands={ExpandSource:{label:'+ expand source',check:function(highlighter){return highlighter.collapse;},func:function(sender,highlighter) {sender.parentNode.removeChild(sender);highlighter.div.className=highlighter.div.className.replace('collapsed','');}},ViewSource:{label:'view plain',func:function(sender,highlighter) {var code=dp.sh.Utils.FixForBlogger(highlighter.originalCode).replace(/'+code+'');wnd.document.close();}},CopyToClipboard:{label:'copy to clipboard',check:function(){return window.clipboardData!=null||dp.sh.ClipboardSwf!=null;},func:function(sender,highlighter) {var code=dp.sh.Utils.FixForBlogger(highlighter.originalCode).replace(/</g,'<').replace(/>/g,'>').replace(/&/g,'&');if(window.clipboardData) {window.clipboardData.setData('text',code);} else if(dp.sh.ClipboardSwf!=null) {var flashcopier=highlighter.flashCopier;if(flashcopier==null) {flashcopier=document.createElement('div');highlighter.flashCopier=flashcopier;highlighter.div.appendChild(flashcopier);} flashcopier.innerHTML='';} alert('The code is in your clipboard now');}},PrintSource:{label:'print',func:function(sender,highlighter) {var iframe=document.createElement('IFRAME');var doc=null;iframe.style.cssText='position:absolute;width:0px;height:0px;left:-500px;top:-500px;';document.body.appendChild(iframe);doc=iframe.contentWindow.document;dp.sh.Utils.CopyStyles(doc,window.document);doc.write('

'+highlighter.div.innerHTML+'

');doc.close();iframe.contentWindow.focus();iframe.contentWindow.print();alert('Printing...');document.body.removeChild(iframe);}},About:{label:'?',func:function(highlighter) {var wnd=window.open('','_blank','dialog,width=300,height=150,scrollbars=0');var doc=wnd.document;dp.sh.Utils.CopyStyles(doc,window.document);doc.write(dp.sh.Strings.AboutDialog.replace('{V}',dp.sh.Version));doc.close();wnd.focus();}}};dp.sh.Toolbar.Create=function(highlighter) {var div=document.createElement('DIV');div.className='tools';for(var name in dp.sh.Toolbar.Commands) {var cmd=dp.sh.Toolbar.Commands[name];if(cmd.check!=null&&!cmd.check(highlighter)) continue;div.innerHTML+=''+cmd.label+'';} return div;} dp.sh.Toolbar.Command=function(name,sender) {var n=sender;while(n!=null&&n.className.indexOf('dp-highlighter')==-1) n=n.parentNode;if(n!=null) dp.sh.Toolbar.Commands[name].func(sender,n.highlighter);} dp.sh.Utils.CopyStyles=function(destDoc,sourceDoc) {var links=sourceDoc.getElementsByTagName('link');for(var i=0;i');} dp.sh.Utils.FixForBlogger=function(str) {return(dp.sh.isBloggerMode==true)?str.replace(/
|<br\s*\/?>/gi,'\n'):str;} dp.sh.RegexLib={MultiLineCComments:new RegExp('/\\*[\\s\\S]*?\\*/','gm'),SingleLineCComments:new RegExp('//.*$','gm'),SingleLinePerlComments:new RegExp('#.*$','gm'),DoubleQuotedString:new RegExp('"(?:\\.|(\\\\\\")|[^\\""\\n])*"','g'),SingleQuotedString:new RegExp("'(?:\\.|(\\\\\\')|[^\\''\\n])*'",'g')};dp.sh.Match=function(value,index,css) {this.value=value;this.index=index;this.length=value.length;this.css=css;} dp.sh.Highlighter=function() {this.noGutter=false;this.addControls=true;this.collapse=false;this.tabsToSpaces=true;this.wrapColumn=80;this.showColumns=true;} dp.sh.Highlighter.SortCallback=function(m1,m2) {if(m1.indexm2.index) return 1;else {if(m1.lengthm2.length) return 1;} return 0;} dp.sh.Highlighter.prototype.CreateElement=function(name) {var result=document.createElement(name);result.highlighter=this;return result;} dp.sh.Highlighter.prototype.GetMatches=function(regex,css) {var index=0;var match=null;while((match=regex.exec(this.code))!=null) this.matches[this.matches.length]=new dp.sh.Match(match[0],match.index,css);} dp.sh.Highlighter.prototype.AddBit=function(str,css) {if(str==null||str.length==0) return;var span=this.CreateElement('SPAN');str=str.replace(/ /g,' ');str=str.replace(/');if(css!=null) {if((/br/gi).test(str)) {var lines=str.split(' 
');for(var i=0;ic.index)&&(match.index/gi,'\n');var lines=html.split('\n');if(this.addControls==true) this.bar.appendChild(dp.sh.Toolbar.Create(this));if(this.showColumns) {var div=this.CreateElement('div');var columns=this.CreateElement('div');var showEvery=10;var i=1;while(i<=150) {if(i%showEvery==0) {div.innerHTML+=i;i+=(i+'').length;} else {div.innerHTML+='·';i++;}} columns.className='columns';columns.appendChild(div);this.bar.appendChild(columns);} for(var i=0,lineIndex=this.firstLine;i0;i++) {if(Trim(lines[i]).length==0) continue;var matches=regex.exec(lines[i]);if(matches!=null&&matches.length>0) min=Math.min(matches[0].length,min);} if(min>0) for(var i=0;i

フォロワー