*関数 [#pa67d98f] **Python [#q93b1e00] >>> def fib(n): # n までのフィボナッチ級数を出力する ... """Print a Fibonacci series up to n.""" ... a, b = 0, 1 ... while b < n: ... print b, ... a, b = b, a+b ... >>> # 今しがた定義した関数を呼び出す: ... fib(2000) 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 """Print a Fibonacci series up to n."""はドキュメンテーション文字列。 関数内で使う変数は関数ローカル。設定時は関数ローカル。参照時は関数ローカルから外へ広がって探す。グローバル変数に設定するにはglobalを使う。 returnで戻り値を返す。戻り値やreturnそのものを書かない場合Noneが返る。 ***デフォルト引数 [#v5f3dd3b] デフォルト引数は1回しか評価されない。 >>> def f(a, L=[]): ... L.append(a) ... return L ... >>> print f(1) [1] >>> print f(2) [1, 2] >>> print f(3) [1, 2, 3] >>> >>> def f(a, L=None): ... if L is None: ... L = [] ... L.append(a) ... return L ... >>> print f(1) [1] >>> print f(2) [2] >>> print f(3) [3] >>> 最初のfは評価時に空リストになってLがそれを指す。次からの呼び出しはすでにできているリストを指すようになるのでこういう結果になるのだろう。2番目の場合はNoneなので呼び出し時には常にNoneになる。 *** * [#g52b2a29] 関数定義の最後の引数に*をつけると、残りの引数のリストになる。 >>> def f(a,*nokori): ... print a ... for n in nokori: ... print n ... >>> f(1) 1 >>> f(2) 2 >>> f(1,2) 1 2 >>> f(1,3,4,5,6,7) 1 3 4 5 6 7 関数呼び出しのときの引数に*をつけるとリストがアンパックされる。 >>> range(3,6) [3, 4, 5] >>> args = [3,6] >>> range(*args) [3, 4, 5] >>> 同様に*の変わりに**を使うとリストじゃなくて辞書になる。 ***ラムダ式 [#hf3f3e43] 無名関数を作成する。一行で書く。 >>> f = lambda a,b: a+b >>> f(1,2) 3 >>> f(1000,22222) 23222 >>>