【Python】かんたんな関数の書き方。引数のデフォルト値、キーワード引数【入門第25回】

113, 2019-08-18

目次

続・関数の書き方

前回は関数の基本的な書き方について解説しました。
今回は引数の使い方についてもう少し詳しくやっていきたいと思います。
Pythonの関数はいろいろ便利な機能が備わっていますが、今回やる引数のデフォルト値キーワード引数もその便利な機能の1つです。

  • 引数のデフォルト値

  • キーワード引数

引数のデフォルト値

まず引数のおさらいですが、関数は↓のように作りました。

:::python
def mul(x, y):
    return x * y

↑の内、カッコ内のxyが引数です。
mul(x, y)の部分ですね。
この引数に値を渡すには↓のようにしました。

:::python
mul(2, 3)

このとき、引数にデフォルト値を設定できると便利な場合があります。
たとえば↓のようにです。

:::python
def mul(x, y=4):
    return x * y

y=4というのが引数のデフォルト値を設定している部分です。
このとき、4引数のデフォルト値と言います。
このようにすると、関数の呼び出しではyの引数を省略することができます。

:::python
# 第2引数(y)を省略している
mul(2)

関数呼び出し時の引数が省略された場合、デフォルト値が設定された引数には、そのデフォルト値が代入されます。
↑の例ではy=4なので、mul関数の中ではyの値は4になります。

:::python
def mul(x, y=4):
    return x * y # yには4が入る

result = mul(2) # 引数yを省略すると
print(result)

↑のコードの実行結果は↓のようになります。

8

引数のデフォルト値の上書き

筆で上書き

引数のデフォルト値は上書きすることができます。
上書きするには関数呼び出しのときに、引数に値を渡します。
たとえば↓のようにです。

:::python
mul(2, 3)

↑のようにすると関数mulの引数yの値を上書きすることができます。
よって↓のコードの実行結果は、

:::python
def mul(x, y=4):
    return x * y # yには3が入っている

result = mul(2, 3) # 引数y3で上書き
print(result)

↓のようになります。

6

引数yの値が、呼び出し時に渡している3の値で上書きされていますね。
上書き前のデフォルト値は4です。

引数のデフォルト値が設定できないケース

便利な引数のデフォルト値ですが、制限もあります。
ある引数にデフォルト値を設定したら、それ以降の引数にもデフォルト値を設定しなくてはいけません。
たとえば↓のコードを見てみましょう。

:::python
def say(word1, word2, word3):
    print(word1, word2, word3)

↑の関数sayの引数にデフォルト値を設定したいとします。
で、引数word3にデフォルト値を設定しました。

:::python
def say(word1, word2, word3='nyan'):
    print(word1, word2, word3)

これは合法なんですが、引数word3ではなく引数word2に値を設定してみます。

:::python
def say(word1, word2='nyan', word3):
    print(word1, word2, word3)

↑のコードはエラーになります。
なぜかというと、引数word2にデフォルト値を設定しているのに、それ以降の引数、つまりword3にデフォルト値を設定していないからです。
なので、↓のようにすれば動くようになります。

:::python
def say(word1, word2='nyan', word3='wan'):
    print(word1, word2, word3)

このように、引数のデフォルト値を設定したらそれ以降の引数にもデフォルト値を設定しなくてはいけません。

Pythonからのお願い

キーワード引数

キーワード

関数の呼び出しでキーワード引数を利用することができます。
このキーワード引数という機能は、Pythonの非常にべんりなところなので、ぜひ覚えるようにしましょう。

たとえば↓のような関数があります。

:::python
def pets(cat, dog):
    print(cat, dog)

ペットを出力する関数ですね。
この関数の呼び出しではふつうにやると↓のようにしていました。

:::python
pets('ミケ', 'ポチ')

↑は↑で問題ないのですが、Pythonではキーワード引数と言って↓のように引数を与えることができます。

:::python
pets(cat='ミケ', dog='ポチ')

↑のように関数呼び出しのときに引数名に値を代入する形で値を渡せます。
cat='ミケ'というのは、関数petsの引数catに文字列ミケを代入するという意味です。
dog='ポチ'も同様です。

これ、何が便利なのでしょうか?
たとえば↓のような関数を考えてみましょう。

:::python
def more_pets(cat, dog, bird, pig, cow, human):
    print(cat, dog, bird, pig, cow, human)

↑の関数を呼び出す場合、↓のようになります。

:::python
more_pets('花子', '次郎', '五郎', '三郎', '四郎', '一郎')

↑の引数を見てください。
これ、どれがどれだかわかりますか?
私はわかりません。

しかしキーワード引数を使えば↓のように書けます。

:::python
more_pets(
  cat='花子',
  dog='次郎',
  bird='五郎',
  pig='三郎',
  cow='四郎',
  human='一郎'
)

↑のようにキーワード引数を使えば、どの値がどの引数に渡されているのかわかりやすくなります。
関数の引数が多くなるケースというのは、非常によくあります。
で、そういったときにキーワード引数で関数を呼び出すようにすれば、パッと見たときにどんな引数にどんな値を設定しているのかわかりやすくなるんですね。

便利!

キーワード引数は順不同で設定できる

キーワード引数を使う場合は、引数の順番を無視することも出来ます

たとえば↓のような関数。

:::python
def pets(cat, dog):
    print(cat, dog)

キーワード引数では、キーワードで引数を指定できるので、関数呼び出しのときに引数の順番を無視することができます。
たとえば↓のようにです。

:::python
pets(dog='ポチ', cat='ミケ')

↑のコードの実行結果は↓のようになります。

ミケ ポチ

ふつうの引数とキーワード引数が混ざった場合

ふつうの引数とキーワード引数が混ざった場合はどうなるのでしょうか。
たとえば↓のようなコードがあります。

:::python
def pets(cat, dog, bird):
    print(cat, dog, bird)

pets('ミケ', dog='ポチ', bird='五郎')

↑のコードの実行結果は↓のようになります。

ミケ ポチ 五郎

キーワード引数の順番も変えることができます。

:::python
pets('ミケ', bird='五郎', dog='ポチ')

このようにふつうの引数とキーワード引数は共存することができます。

おれたちゃ仲良し

しかし、キーワード引数にも制限があります。
キーワード引数で指定したら、それ以降の引数もキーワード引数にしなくてはいけません。
なので、↓の関数呼び出しはエラーになります。

:::python
pets('ミケ', dog='ポチ', '五郎')

↓もエラーです。

:::python
pets(cat='ミケ', 'ポチ', bird='五郎')

おわりに

関数の引数の扱い方を覚えると、関数が好きになれます。
最初はなかなかイメージ通り行かなくて、イライラすることもあるかもしれません。
しかし、大丈夫です。そのうち慣れます。

次回に続きます。

また見てね

関連動画