Python高座


9. 関数

今回は関数の定義の話である。 関数は何かを入れると何かを返すものである…と説明にもならないことを言っても仕方がないだろう。 c でいうところの関数、awk でいうところの関数である(ますます説明になっていない)。 awk ならば function というおまじないを唱えるのだが、python では def と唱える。それから関数名と引数が来るのは言うまでもないだろう。そして、':'。返す値は処理の塊に return 文を入れればいい。いつものように書けば

def 関数名(引数1,引数2,...,引数n):
ここで引数には 引数=既定値 という形で既定値を入れておくことができる。但し既定値のある引数の後ろに既定値を持たない引数を置いてはいけない。というのは与えられた引数がどの引数かの解釈に困るからだ。関数の例はこんな具合。

>>>def gcd(a,b):
... while a:
...  a,b=b%a,a
... return b


見ての通り、世界最古のアルゴリズム、最大公約数を求める「ユークリッドの互除法」である。こうしておけば、

>>>gcd(840,1024)
8

となる。

これで終りではない。実は python はλ関数も使えるのだ。といっても、これは使う機会はそうないかもしれない。

lambda 引数1,引数2,...,引数n : 式
という形で使う。普通はリストの内容に関数を作用させる map などと共に使うことになる。例えば、1から10までの数の立方のリストが欲しいとき(なんてのがあるかどうかしらないが)は次のようにする。

>>>rippou=map(lambda x: pow(x,3),range(1,11))
>>>rippou
[1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]

ここで、λ関数を使わないと、

>>>map(pow(x,3),range(1,11))
Traceback (innermost last):
 File "", line 1, in ?
NameError: x

と怒られる。つまり、むき出しで変数を渡すように書いてはダメなのである。λ関数を使わずに、例えば cube という名の関数を定義しておけばそれでもいいのであるが、そんな関数はそこでしか使われないだろうから無駄になる。そこで、名前のない関数として、λ関数を使うのである。最後にばかばかしい関数を作ってみよう。どういう働きをするかは自分で考えてみて欲しい(実際に動かしてみてもつまらないから)。

def nazo(n):
 return map(lambda x,n=n:map(lambda y,x=x:x==y,range(n)),range(n))


目次索引