ホーム     戻る

第9章 メソッド  
 
 
    

ひとりで生き、この世を観

この世の雨の音をきき

そしてまた死んで行ったとしても

何者をこの世に残さなかったとしても

それだけで沢山ではないか

その片鱗をかがやかせただけで

蝶はわが眼から失われて行ったではないか


 百田宗治


(1)メソッドの作り方

モジュールプログラム
自分で作成したプログラムをモジュールに入れてパッケージ化
              する。

サブルーチン:プローシージャー、関数として存在する。 

メソッドmethod関数のようなもの
    
       名前.名前(引数....)の形:呼び出し可能な属性

def メソッド名():
   メソッド

>>>                            メソッド名
def hello() :
      print 'hello python'            メソッド本体
 
                                メソッドを呼び出す
>>> hello()
hello python

def hyouka(t):
   
                              メソッドの名前
if t>=1 and t<=50 :
                                メソッドの内容
  print 'low'
    elif   t>50 and t<=75:
     print 'middle'
    else:
          print 'high'
 
                                   メソッドの呼び出
hyouka(76.9)
 
                                   応え 
high'
同じコードの繰り返す例:


 次のコードを読んでください
print '今日は、私の実験のためにお時間をとって、'
print 'いただき、ありがとうございます。この実験は、'
print '人々が日本料理に対してどう感じているか'
print 'に関するものです。日本料理について考え'
print 'すべての質問に対して、yesかnoかで正直に'
print '答えてください。この実験は簿記学とは関'
print 'ありません。'
#  いくつかの質問をしますが、答えは無視してしまいます
good_answer = False                                                  
繰り返し部分
while(not good_answer) :
    print '天ぷらは好きですか?'
    answer = raw_input('>')
    if answer == ('yes' or answer == 'no') :
        good_answer = True
    else  :
        print ' "yes" か "no"でお答えください。 '
good_answer = False
while (not good_answer)    :                     
繰り返し部分
     print 'フグ料理は好きですか?'
     answer = raw_input('>')
     if answer == ('yes' or answer == 'no') :
     
   good_answer = True    
    else  :
       print ' " yes" か"no" でお答えください。'
 
#この回答には注目します
good_answer = False                         
 繰り返し部分
while (not good_answer)
     print '簿記の勉強は好きですか?'
     answer = raw_input('>')
     if answer == ('yes' or answer == 'no')  :
        good_answer = True
    else  :
        print ' " yes か no でお答えください。"
good_answer = False                         
繰り返し部分
while (not good_answer)
     print '焼き肉料理
は好きですか?'
     answer = raw_input('>')
     if answer == ('yes' or answer == 'no') :
        good_answer = True
    else  :
        print
' " yes "か "no" でお答えください。'
print 'あともう少し質問させてください'
good_answer = False                          
繰り返し部分
while (not good_answer)
     print 'そば料理は好きですか?'
     answer = raw_input('>')
     if answer == ('yes' or answer == 'no') :
        good_answer = True
    else  :
        print ' " yes "か" no "でお答えください。'
# 日本料理に関しては他にもたくさんの質問をします。
print
print 'デブリーフィング:' #実験後、被験者にその目的や理由を明かすこと
print 'この実験へのご協力を感謝します。実は、この実'
print '験は日本料理とは何の関係もありません'
print'この実験は簿記学への関心に関する実験だっ'
print'日本料理は、より正直に答えら'
print'られるよう、あなたのガードをはづすために聞いた'
print'に過ぎません。本当にありがとうございました。'
print
print book_keeping
 (クリス・はじめてのプログラミング

 

(2)上記のコードを修正するための知識
 まづ簡単な例の学習

(a)自前のメソッド を作る。「モー」となくメソッドです。
>>> def say_moo():
      print 'モー'
>>> say_moo();say_moo()
モー
これでsay_mooというメソッドの定義した。

 メソッド引数
メソッドにはオブジェクトに対して単独で用いられるraw_input().str().reverseなどと、引数(引数)をとって、オブジェクトがそのメソッドをどのように実行するかを指示する必要があるものがあります。

say_moo()鳴く回数を引数として加えるには、どうするか考えてみましょう
>>> def say_mo():
      for i in range (3) :
         print 'モー'
  
>>> say_mo()
モー
モー
モー
>>> def say_moo():
        for i
in range(3):
          print 'モー'
 ,                         ,  演算子を使用して1行に出力
>>> say_moo()
モー  モー モー
 i in range(3):はメソッドを実行するときに与えられた引数を(メソッドの中から)指し示すための変数です。引数は3です。
オブジェクトが名詞で、メソッドが動詞であるならば、引数は副詞にあたります。牛がモーと
3回鳴く。

(b) 土地建物長期譲渡の税関数を作る。
 
def tyo_jyoto() :                                      
#長期土地建物の譲渡です
 
jyotokin=input('譲渡価額>')
 syutokukin=input('取得価額>')         
#不明の場合は譲渡価額の
                               #
5%とします。
 jyotohi=input('譲渡費用>')           #不動産仲介料等です。
 
zei=round((jyotokin-syutokukin-jyotohi)*0.2)
 sikin=jyotokin-syutokukin-jyotohi-zei
 print'譲渡税=国・住', zei
 print'資金増',sikin
 
>>> tyo_jyoto()
譲渡価額>
3000
取得価額>
150
譲渡費用>
50
譲渡税=国・住
560.0
資金増
2240.0
 
(c)局所変数 Local variable
 
>>> def double_this() :
      num = 0
      num =input('>')
      num_times_2= num * 2
      print str(num ) + 'の2倍は ' +str(num_times_2)
>>> double_this()
>44
44の2倍は 88
変数1 numと  変数2 num_times_2 と二っあります。
この二つは局所変数です。メソッドの内部にのみ存在する関数です。

>>> double_this()
>56
56の2倍は 112
>>> print num_times_2
Traceback (most recent call last):
  File "<pyshell#6>", line 1, in <module>
    print num_times_2
NameError: name 'num_times_2' is not defined
 変数num_times_2を外部から使用できません・メソッドの中でのみ有効。

>>> def little_pest():
>>> tough_var = 'nil'
>>> print 'ハッーハッハー!  お前の変数は破壊したぞ!'
 >>> tough_var = '君はこのタフな変数に手を触れることはできない!'
>>> little_pest()
ハッーハッハー!  お前の変数は破壊したぞ!
>>> print tough_var
君はこのタフな変数に手を触れることはできない

内部変数の tough_var と外部変数の tough_var の二つありますが、何の関係もない。

(d) 返り値
print  キボードから入力された文字列を返す。
5+3 はの中の+というメソッドは8を返します
メソッドはその値をメソッドが呼んだコードに返す
print はプログラムが画面に対して情報を出力する

>>> def say_moo() :
     print 'モー'
 
>>> say_moo()
モー
>>> print say_moo()    say_moo()メソッドが出力したモノ、最後の式モー。
モー
None
            print が出力したモノ、。printはいつもNoneを返す。
               文字列を返すようにしたければ、それをメソッドに追
               加。
>>> def say_moo():
 print 'モー'
 print 'yellow submarine'
 
>>> say_moo()
モー
yellow submarine
最後に評価した式を返す

(e) return文

日本語でうまくいかないので英文で実行。
return文を使う.。
return文は関数の中で使い、カッコを使わないで関数の外に受け渡したいデータをそのまま記述。
>>> def f(a,b):
           c = a +b
          return c
>>> f(7,8)
15
 
>>> def times(x,y):        変数オブジェクトを作成し、関数名に代入
          return x*y          呼び出された場合に実行されるボディ 
>>> times(34,67)      カッコ内に引数を指定し、呼び出す。
2278

def favorite_food():
     name =raw_input('input  name>')
    if name == 'lister' :               人名です。
           return 'vindar'           好みの食物です。
    if name == 'lima' :       
           return 'mashe poteto'
 
>>> favorite_food()
input  name>lister
'vindar'
>>> favorite_food()
input name>lima
'mashe poteto'

return文を使わない。
>>> def favorite_drink():
         name=raw_input('name>')
          if name =='janrick' :
               print 'ar grey hot'
          if name =='cathaline' :
               print 'black coffe'
 
>>> favorite_drink()
name>cathaline
black coffe
 
 
(3) これで自分のメソッドを作ることを学だので、
ここで心理学の実験プログラムを修正。
あいさつ文の関数
 
 
def aisatu() :
        print '今日は、私の実験のためにお時間をとって、'
        print 'いただき、ありがとうございます。この実験は、'
        print '人々がメキシコ料理に対してどう感じているか'
        print 'に冠するものです。メキシコ料理について考え'
        print 'すべての質問に対して、yesかnoかで正直に'
        print '答えてください。この実験はおねしょとは関係'
        print 'ありません
。'
aisatu()と入力すると、あいさつ文が画面に出力されます。
質問文
 
>>> q1 ='タコス'
>>> q2 ='プリート'
>>> q3 = 'ベッドを濡らしますか?'
>>> q4 = 'チミチャン'
>>> q5 = 'ソバイピーヤ'
>>> q6 = 'オルチャタ'
>>> q7 = 'フラウタス'
>>> q10 ='はお好きですか'
>>> print q1+q10

タコスはお好きですか         
  
 
質問ブロックの関数
 
>>> def ask():  
          good_answer = False
     while (not good_answer):
               reply = raw_input('"yes","no">')
           if (reply =='yes'or reply =='no'):
             good_answer= True
           elif  reply =='yes' :
            answer = True
           elif  reply =='no':
            answer = False
           else  :                                                         print 'yesかnoでお答えください'
 >>> ask()
"yes","no">no
>>> ask()
"yes","no">yes
>>> ask()
"yes","no">nonono                      
yesかnoでお答えください
"yes","no">

実験の目的を明かす文

>>> def db():
 print 'デブリーフィング'
 print 'この実験へのご協力を感謝します。実は、この実'
 print '験はメキシコ料理とは何の関係もありません。'
 print 'この実験は夜尿症(おねしょ)に関する実験だっ'
 print 'たのです。メキシコ料理はより正直にこたえら'
 print 'れるよう、あなたのガードをはずすために聞いた'
 print 'にすぎません。本当に有難うございました。'

練習問題 askメソッドを修正してくださいgood_answer,answerの二つの変数を取り除くこと。ループから抜けるのにreturn文を使う。

      

ホーム     戻る