関数

Pythonでは当然、関数も作成できる。関数が作成できるようになると一気にプログラミング言語感が増してくるというものだ。Pythonでは「def 関数名(引数):」といった記述で関数を定義することができる。関数はよく使われる機能なので、書けるようにも読めるようにもなっておきたい。

例えば「The Python Tutorial」には次のような関数のサンプルコードが掲載されている。

>>> def fib(n):    # write Fibonacci series up to n
...  """Print a Fibonacci series up to n."""
...  a, b = 0, 1
...  while a < n:
...   print(a, end=' ')
...   a, b = b, a+b
...  print()
...
>>> # Now call the function we just defined:
... fib(2000)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597
>>>

この関数は、以前取り上げたフィボナッチ数列を出力するコードを関数にしたものだ。Pythonの関数を説明する良いサンプルになっている。この関数サンプルからは、次のようなことがわかる。

  • 関数は「def 関数名(引数):」から書き始める。defで始まる行の最後は「:」で終える
  • defの次の行にはオプションでコメントを書くことができる。このコメントは関数の説明として使われる。できれば関数には必ずここに関数の説明を書くようにする
  • defの次の行からは必ずインデントを行う必要がある。このインデントが関数の範囲を表現することになる
  • 返り値を記載しなかった場合にはNoneが返り値として使われる


上記関数のサンプルコードには返り値が記載されていないが、この場合には自動的に返り値として「None」が使われるようになる。次のようにfib()関数の返り値をそのまま出力させることで確認できる。

>>> fib
<function fib at 0x7fa659069ea0>
>>> f = fib
>>> f(2000)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597
>>>

上記のサンプルでは、関数を変数のようにしてほかの名前でアクセスできるようになっていることもわかる。

返り値を明示的に記述するとたとえば次のようになる。これはリストを返り値としている。返り値には条件に一致する値のみが含まれるようになっており、そのリストが返り値として戻るようになっている。

>>> def fib2(n):  # return Fibonacci series up to n
...  """Return a list containing the Fibonacci series up to n."""
...  result = []
...  a, b = 0, 1
...  while a < n:
...   result.append(a)    # see below
...   a, b = b, a+b
...  return result
...
>>> f2000 = fib2(2000)    # call it
>>> f2000
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597]
>>>

関数の引数にはデフォルト値を指定することもできる。次のように引数を書く部分で値を代入するようにすると、その値がデフォルト値として使われるようになる。

>>> def ask_ok(prompt, retries=4, reminder='Please try again!'):
...  while True:
...   ok = input(prompt)
...   if ok in ('y', 'ye', 'yes'):
...    return True
...   if ok in ('n', 'no', 'nop', 'nope'):
...    return False
...   retries = retries - 1
...   if retries < 0:
...    raise ValueError('invalid user response')
...   print(reminder)
...
>>> ask_ok("Input something: ")
Input something: 1
Please try again!
Input something: 2
Please try again!
Input something: 3
Please try again!
Input something: 4
Please try again!
Input something: 5
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 10, in ask_ok
ValueError: invalid user response
>>>

「関数引数のデフォルト値は1度だけ評価される」という点には注意しておく必要がある。次のサンプルを見るとよくわかる。

>>> i = 5
>>>
>>> def f(arg=i):
...  print(arg)
...
>>> i = 6
>>> f()
5
>>>

上記サンプルでは変数iが一度だけ評価されるので、関数を定義した段階でiに代入されている「5」がデフォルト値として使われていることがわかる。

関数の使い方としてはまずこの辺りが基本的なところだ。Pythonのコードでは関数が1つの処理単位として重要になってくる。この辺りの書き方や読み方はちゃんとマスターしておこう。