Pythonの関数、超速入門特集:Visual Studioで始めるPythonプログラミング(1/3 ページ)

今回はPythonの関数――通常の名前付き関数、ラムダ式で作成する無名関数、反復的に値を返すジェネレーター――について見ていこう。

» 2016年10月07日 05時00分 公開
[かわさきしんじInsider.NET編集部]
「特集:Visual Studioで始めるPythonプログラミング」のインデックス

連載目次

 前回は、Pythonの基本構文を幾つかと、リスト/タプル/辞書/集合という4つのデータ構造を紹介した。これらはPythonでコードを書く上で必須となる要素だ。今回はもう1つの大きな要素である関数を取り上げる。前回同様、既に他の言語の経験がある方を対象に、例を交えながら超速で関数を見ていこう。

関数

 Pythonで関数を定義するにはdefキーワードを使用する方法とlambdaキーワードを使用する方法がある。前者は名前付きの関数を、後者はラムダ式(無名関数)を定義するものだ。まずは通常の(名前付き)関数の定義から見てみよう。今回もPython Tools for Visual Studioが提供する[Interactive]ウィンドウを利用して、対話的にPythonコードを入力していく。

defキーワードによる関数定義

 以下にdefキーワードによる関数定義の基本構文を示す。

def 関数名(パラメーターリスト):
  関数定義のボディー


関数定義文の構文

 関数定義文は実行可能な文であり、Python処理系がこれを実行することで、その名前が識別子として導入され、その識別子と関数オブジェクトが関連付けられる。

 簡単な例を以下に示す。

>>> def hello(to):
...   print("hello {0}".format(to))
... 
>>> hello("insider.net")
hello insider.net
>>> greet = hello
>>> greet("insider.net")
hello insider.net


関数helloの定義と呼び出し

 これはパラメーターを1つ取り、その値と文字列を書式化したものをコンソールに出力する関数だ。Pythonでは関数もオブジェクトであるため、変数greetに関数helloを代入して、その後、「greet(...)」のように呼び出すことも可能だ。

関数の引数

 関数のパラメーター名は、その呼び出し時に「キーワード引数」のキーワードとして利用できる。また、パラメーターにはデフォルト値(デフォルト引数)を指定することも可能だ。以下に例を示す。

>>> def calc(a, b, op='+'):
...   if op not in "+-*/":
...     return
...   print(eval("{0} {1} {2}".format(a, op, b)))
... 
>>> calc(1,1)
2
>>> calc(1, 2, '-')
-1
>>> calc(1, op='*', b=0.5)
0.5


キーワード引数とデフォルト引数

 関数calcは3つのパラメーターを取る。aとbの2つのパラメーターには数値を、パラメーターopには四則演算を表す記号のいずれかを指定してこの関数を呼び出すとその結果がコンソールに出力される。パラメーターopにはデフォルト値「'+'」が指定されている(他の2つにはデフォルト値はない)。

 最初の呼び出し例では第3引数を省略している(デフォルト引数を利用)。次の呼び出し例では3つの引数を全て指定している。これらの引数は「位置指定引数」(positional argument)と呼ばれ、引数リストに並べた順番に引数がパラメーターに引き渡される。最後の呼び出し例では、第1引数は位置指定、残る2つについては「キーワード引数」形式で引数がパラメーターに渡されている。

 キーワード引数と位置指定引数を混在させて関数を呼び出す場合には、キーワード引数よりも先に位置指定引数を指定する必要がある。また、デフォルト値を持たないパラメーターについては呼び出し時に引数を指定する必要もある。以下に例を示す。

>>> calc(op='*', 2, 3)  # 位置指定引数をキーワード引数より後に指定
  File "<stdin>", line 1
SyntaxError: positional argument follows keyword argument
>>> calc(1, op='-')     # デフォルト値を持つのは第3引数のみ
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: calc() missing 1 required positional argument: 'b'


誤った関数呼び出し

 可変数個の引数については、Pythonではタプルもしくは辞書を利用して受け取る。一般的な引数はタプルに、キーワード引数は辞書に受け取る形になる。以下に例を示す。まずはタプルを利用する場合だ。

>>> def foo(a, b, *args):  # 3つ目からはタプルargsに受け取る
...   print("contents of args")
...   for arg in args:
...     print(arg)
... 
>>> foo(1, 2, 100, ["insider.net", "windows server insider"])
contents of args
100
['insider.net', 'windows server insider']


タプルで可変数個の引数を受け取る

 タプルで受け取る場合には、そのパラメーター名の前に「*」を前置する。このとき、パラメーター名には「args」を使用するのが通例だ。

 辞書でキーワード引数を受け取る場合は次のようになる。

>>> def bar(a='foo', b='bar', **kwargs):
...   print("contents of keywords args")
...   for k, v in kwargs.items():
...     print("{0}: {1}".format(k, v))
... 
>>> bar(c='hoge', d='huga')
contents of keywords args
c: hoge
d: huga


辞書で可変数個の引数を受け取る

 辞書で受け取る場合には、そのパラメーター名の前に「**」を前置する。このとき、パラメーター名は「kwargs」にするのが通例だ。関数barでは、辞書に対してitemsメソッドを呼び出して、「キー/値」の組を反復的に取り出している。また、関数barの呼び出しでは、パラメーターaとbがデフォルト値を持つため、省略している。よって、指定した2つの引数はいずれもパラメーターkwargsに渡されている。

 タプルや辞書の内容を展開して、関数に渡したいというときには上で見た「*」や「**」を関数呼び出し側で利用する。以下に例を示す。

>>> t = (1, 2)
>>> calc(*t, '/')
0.5
>>> d = { 'a': 'foo', 'b': 'bar' }
>>> bar(**d, c='hoge', d='huga')
contents of keywords args
c: hoge
d: huga


タプルや辞書の値を展開して関数に渡す

 次にlambdaキーワードを使用した無名関数の作成と利用について見てみよう。

       1|2|3 次のページへ

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。