連載
» 2019年05月21日 05時00分 公開

Python入門:[Python入門]関数の引数 (2/3)

[かわさきしんじ,Deep Insider編集部]

デフォルト引数値

 関数のパラメーターには「デフォルト引数値」を持たせることができる。「デフォルト引数値」とは関数呼び出し時に実引数の指定を省略したときに、そのパラメーターに与えられる値のことだ。通常は「デフォルトの動作」つまり「既定の動作」を行い、その挙動を(少しだけ)変化させたいといったときにはパラメーターにデフォルト引数値を持たせると便利だ。

 デフォルト引数値は、関数を定義する際にパラメーターリストで「パラメーター名=デフォルト引数値」とすることで指定できる。先ほど定義したmyfunc関数のパラメーターにデフォルト引数値を持たせてみよう。

def myfunc(param1='param1', param2='param2', param3='param3'):
    return f'param1: {param1}, param2: {param2}, param3: {param3}'

関数のパラメーターにデフォルト引数値を持たせたmyfunc関数

 この例では、全てのパラメーターにデフォルト引数値を持たせている。そのため、myfunc関数は引数を1つも指定せずに呼び出せる。以下に呼び出し例を示す。

print(myfunc())  # 引数を全て省略
print(myfunc(1))  # 第2引数と第3引数を省略
print(myfunc(param2=2))  # パラメーターparam2の値だけを指定して、他は省略

デフォルト引数値を持つ関数の呼び出し例

 コメントにも示したが、最初の呼び出し例は全ての引数を省略している。この場合は、全てのパラメーターでデフォルト引数値が使われる。次の例は位置引数を1つだけ指定したものだ。このときには、第2パラメーターのparam2と第3パラメーターのparam3にデフォルト引数値が与えられる。最後の例は、キーワード引数を使って第2パラメーターであるparam2にだけ実引数を渡している。このときは第1パラメーターのparam1と第3パラメーターのparam3にデフォルト引数値が渡される。実行結果は次の通りだ。

実行結果 実行結果

 デフォルト引数値を指定する際に注意したいのは、パラメーターリストの中でいずれかのパラメーターにデフォルト引数値を指定したら、それ以降(そのパラメーターよりも右側)のパラメーターにもデフォルト引数値を指定する必要があるところだ。例えば、次のような関数定義は許されない。

def myfunc(param1='param1', param2, param3='param3'):
    return f'param1: {param1}, param2: {param2}, param3: {param3}'

第1パラメーターのparam1がデフォルト引数値を持つので、他の全てのパラメーターでもデフォルト引数値を指定する必要がある

 この例では、第1パラメーターのparam1と第3パラメーターのparam3にはデフォルト引数値を指定しているが、第2パラメーターのparam2には指定していない。第1パラメーターがデフォルト引数値を持っているので、本来は全てのパラメーターでデフォルト引数値が必要になるので、このdef文を実行するとエラーとなる。

構文エラーが発生する 構文エラーが発生する

 エラーメッセージには「デフォルト引数値を持たないものが、デフォルト引数値を持つもの後にある」とある。デフォルト引数値を指定する場合には、このことに注意が必要だ。

 デフォルト引数値が役に立つのは、関数が数多くのパラメーターを持つと共に、通常はそれらに与える実引数が決まり切っているような場合だ。例えば、これまでに特にパラメーターリストを示さずに使っていたprint関数は以下に示すパラメーターを持つ。

print関数

print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)


 objectsに指定されたものを、sepに指定された文字で区切って出力し、最後にendに指定された文字を出力する。

パラメーター 説明
*objects 出力するオブジェクトをカンマで区切って並べる(後述する「可変長引数」を受け取るためのパラメーター)
sep 複数のオブジェクトを表示する際に区切りに使用する文字。デフォルト引数値は' 'であり、この場合、オブジェクトは半角の空白文字で区切って表示される
end 最後に出力する文字。デフォルト引数値は'\n'で、この場合は最後に改行が行われる
file 出力先のファイル。デフォルト引数値はsys.stdoutで、この場合は標準出力(画面など)に出力が行われる(ファイル操作を扱う回で詳しく説明する)
flush 出力をバッファリングするかどうかの指定。デフォルト引数値はFalseで、この場合は、バッファリングを行わない(ファイル操作を扱う回で詳しく説明する)
print関数のパラメーター


 第1パラメーターの「*objects」は「可変長引数」と呼ばれる引数を受け取るためのパラメーターで、ここでは「出力したいものをカンマで区切って任意の数だけ並べたもの」を受け取る(可変長引数については後述)。それ以外のパラメーターが全てデフォルト引数値を持っていることに注目しよう。

 これまで、何かの値を画面に出力するには次のようなコードを実行していた。以下の例なら、2つの文字列'some'と'value'が半角の空白文字で区切られて「some value」と表示される(最後に改行も行われる)。

print('some', 'value')

画面に「some value」と表示するprint関数呼び出し(その1)

 このとき、引数に指定した文字列'some'と'value'は第1パラメーターのobjectsに渡される。引数は他にないので、残りのパラメーターにはデフォルト引数値が与えられる。つまり、上のprint関数呼び出しは以下と同値である(ただし、実際に実行するには「import sys」をその前に実行しておく必要がある)。

print('some', 'value', sep=' ', end='\n', file=sys.stdout, flush=False)

画面に「some value」と表示するprint関数呼び出し(その2)

 このコードを実行すると、1つ目のコードと同様に、複数の値は半角空白文字で区切られ、最後に改行が行われる(そのため、「some value」となる)。通常はこうした動作で問題はない(だからこそ、デフォルト引数値がそのような値になっている)。だが、たまには複数の値を区切り文字なしで表示したくなることもある。そうした場合は、パラメーターsepに渡す値を空文字列にできる。以下に例を示す。

print('some', 'value', sep='')

画面に「somevalue」と表示するprint関数呼び出し

 このコードでは、第1パラメーターのobjectsには先ほどと同様に2つの文字列が渡されて、パラメーターsepには空文字列「''」が渡される。それ以外はデフォルト引数値が使われる。よって、このコードの実行結果は次のようになる。

実行結果 実行結果

 このように、通常は既定の動作で問題ないが、状況に応じて関数の挙動に変更を加えたいようなときにデフォルト引数値が便利に使える。自分でユーザー定義関数を定義する際には「自分が利用者」であり、「どうすればその関数が使いやすくなるか」という観点から、パラメーターにデフォルト引数値を持たせるかどうか、持たせるとすれば適切な値はどんなものかを考えるようにしよう。

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

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

メールマガジン登録

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