関数
ルーチンワークとは、繰り返し決まりきった仕事を行うことを言います。人間だったら、同じことをなんども教えなければいけませんが、Iron Pythonはコンピュータなので、一度教えたことは、「忘れなさい」というまでいつまでも覚えています。なので、一回定義してしまえば何度でも繰り返し行えます。そんなわけで繰り返し使う決まりきった手順を定義したものとして、『関数』というものがあります。
関数を定義する
まず、関数を定義するために関数名が必要です。とはいっても何でもいいです。例えばサッカーやバレーなんかの試合のとき、攻める方法を予め決めといて、A-1とかフォーメーションXとか適当に名前をつけて仲間に何をするのか伝えたりします。
それと同じで、Iron Pythonとあなただけの間で合言葉を決めておけば、Iron Pythonは合言葉に合わせて作業してくれます。
定義という英語のdefineからくる"def"から始まって次のように書きます。
def 関数名([引数]):
やること
[ ]で囲ったところは省略可能です。
こんな感じで定義します。引数とは、関数のなかで変数を指定して作業のときに使います。だからとただ単にやるだけの作業の場合は略します。また"やること"の前に空白が入ってインデントされています。関数とは定義された命令のかたまりな訳ですから、ここまでが関数でひとかたまりだと言うことが、Iron Pythonに分かるようにブロックで表現します。説明してもなんのこっちゃですね。やっぱり例を使って説明します。
# coding: shift-jis
def valume(width, depth, height):
print width * depth * height
valume(1,2,3)
raw_input()
出力画面:
6
上の例は幅と奥行きと高さから体積を求める関数です。幅1 奥行き2 高さ3 にすると体積は6になりました。引数のデフォルト値、キーワード指定
引数のデフォルト値?デフォルトというのは元々"何もしない"という意味があります。何もしない値・・・つまり初期設定値です。かっこよく言ってますが、たいしたことないです。
つまり引数のデフォルト値というのは引数を指定しないときに使われる値のことです。使い方の例は次のとおりです。
# coding: shift-jis
def valume(width, depth=4, height=3): ←関数定義の際に引数の後にイコールを
print width * depth * height つけてデフォルト値を設定します。
valume(2) ←2×4×3を計算
valume(2,3) ←2×3×3を計算
valume(2,5,6) ←2×5×6を計算
raw_input()
出力画面:
24
18
60
上のプログラムで"valume(2,5,6)"と記述されていますが、2,5,6がそれぞれ何の値だったか、関数定義の順番を覚えていなければいけません。またその順番を間違えるというミスしてしまう可能性も上がってきてしまいます。なので、関数を使うときにキーワードで指定することでそういったミスをなくすこともできます。次はキーワード指定した場合の
例です。
# coding: shift-jis
def valume(width, depth=4, height=3):
print width * depth * height
valume(width=2) ←キーワード指定で引数を明記しています。
valume(width=2, height= 5) ←デフォルト値を飛ばして指定することもできます。
valume(height=2, width=5, depth=6) ←順番をバラバラにしても構いません。
raw_input()
出力画面:
24
40
60
関数の戻り値
関数で実行した結果を再利用することもできます。再利用するために関数が戻す結果の値を戻り値といいます。戻り値には、数値、文字列、リストなどIron Pythonで扱えるものを指定することができます。# coding: shift-jis
def cubic(length):
return length * length * length
print cubic(4) ← print文に使用した場合
raw_input()
c6= cubic(6) ← 変数に代入して使用した場合
print "6の3乗は", c6, "です。"
raw_input()
def cubic2(length):
return [length, length * length * length] ← 戻り値はリスト!
c5 = cubic2(5) ← リストに代入して使用した場合
print c5[0],"の3乗は",c5[1],"です。"
raw_input()
出力画面:
64
6の3乗は 216 です。
5 の3乗は 125 です。
関数のローカル変数
またまた"ローカル"なんてカタカナが出てきました。"局所的な"みたいな意味なんです。簡単にいうとローカル変数は井の中の蛙変数みたいなものです。関数中だけに影響力がある変数のこと。逆にどこでも使える変数のことをグローバル変数と呼びます。例を見てみましょう。# coding: shift-jis
a=100
b=20
print a,b
def function():
a = 1
print a,b
function()
print a,b
raw_input()
出力画面:
100 20
1 20
100 20
初めに100が代入された変数aはグローバル変数です。20を代入された変数bもグローバル変数です。次に関数functionの中で定義された変数aは関数functionのローカル変数です。最初のprint文はグローバル変数a,bを表示します。次に関数function内のprint文ではローカル変数の方が強いので、ローカル変数a,とグローバル変数bを表示しています。最後に関数functionから抜け出して行われるprint文はローカル変数の力は及びませんので、再びグローバル変数a,bを表示します。
グローバル変数bは競合する変数はいないので、関数functionの中でも使えていますね。でも関数functionを定義する前に変数bを定義しているからできるのであって、変数bを定義する前に関数functionを定義しちゃったらどうなるでしょう。
試してみましょう。
# coding: shift-jis
def function():
a = 1
print a,b
a=100
b=20
print a,b
function()
print a,b
raw_input()
aw_input()
出力画面:
100 20
1 20
100 20
あら、変わりません。関数がグローバル変数を参照するのは関数を定義するタイミングでなく、関数を使うタイミングのようです。使うときに定義されていれば、問題ありません。
引数の値渡し・参照渡し
またまたややこしい言葉がでてきました。そんなに難しいことではありません。
例を見てみましょう。まずは引数の値渡しです。
# coding: shift-jis
def function(a):
print a
a += 5
print a
a=10 ←数値変数を指定します。
print a
function(a)
print a
raw_input()
出力画面:
10
10
15
10
では次に引数の参照渡し
# coding: shift-jis
def function(a):
print a[0]
a[0] += 5
print a[0]
a=[10] ←リスト変数を指定します。
print a[0]
function(a)
print a[0]
raw_input()
出力画面:
10
10
15
15
違いがわかりますか?出力でみると最後の値が10か、15かの違いです。値渡しはグローバル変数の値だけを関数に教えるので、関数の中で値を変更してもグローバル変数自体の値は変わりません。なので関数functionから出た後の最後のprint文ではグローバル変数 aの値に戻っています。
逆に参照渡しでは、変数自体を渡してしまうので、関数の中で値を変更してしまうと関数から抜け出しても値は関数が変更したままになります。そのため、例では最後のprint文で変更された変数a[0]が表示されます。
値渡しになるか、参照渡しになるかは以下のように変数の種類によります。
値渡しされる変数は 数値、文字列、bool値、タプル
参照渡しされる変数は リスト、辞書、Set