[光-Hikari-のPython]06章-03 関数（引数と戻り値2）

#[Python]06章-03 引数と戻り値2
前節では引数と戻り値について触れていきましたが、引数の指定方法にはほかにも存在します。
今回は、実引数と仮引数が複数ある場合について少し深く見ていきたいと思います。

##キーワード引数
まずは、キーワード引数の説明になります。いきなりですが、<font color="#00cccc">chap06</font>の中に、<font color="#00cccc">samp06-03-01.py</font>というファイル名でファイルを作成し、以下のコードを書いてください。
なお、**last_name**は苗字を、**first_name**は名前を表します。

```samp06-03-01.py
def yamada_func(last_name, first_name, age):
    print(f'氏名：{last_name} {first_name}、年齢：{age}歳')


yamada_func('山田', '一郎', 19)
yamada_func('山田', '二郎', 17)
yamada_func('山田', '三郎', 14)
```

><font color="#090" bgcolor="black">【実行結果】</font>
氏名：山田 一郎、年齢：19歳
氏名：山田 二郎、年齢：17歳
氏名：山田 三郎、年齢：14歳

まず、前節で細かくは説明していなかったのですが、関数を呼び出す際に、以下のように指定した実引数は仮引数に渡す際に、**左から順番を変更することなく**渡しています。
（**'山田'**が仮引数の**first_name**に渡されることはないということです。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602679/1171a2bf-ff07-6515-c3a4-b5ec38bcde0a.png)

しかし、以下のように、どの実引数がどの仮引数に代入されるかを指定することが可能です。先ほど書いたプログラムを以下のように修正してください。

```samp06-03-01.py
def yamada_func(last_name, first_name, age):
    print(f'氏名：{last_name} {first_name}、年齢：{age}歳')


yamada_func(first_name='一郎', age=19, last_name='山田',)
yamada_func('山田', '二郎', 17)
yamada_func('山田', '三郎', 14)
```
><font color="#090" bgcolor="black">【実行結果】</font>
氏名：山田 一郎、年齢：19歳
氏名：山田 二郎、年齢：17歳
氏名：山田 三郎、年齢：14歳

今回、実引数と仮引数の順序はバラバラですが、**仮引数の変数名を指定すると順序を気にしなくても関数を呼び出すことができます**。このような引数に変数を指定する方法を**キーワード引数**と言います。
また、この節で一番最初に書いたプログラムは順序を気にしなければなりません。このような変数を指定しない方法を**位置引数**と言ったりします。

##デフォルト引数
先ほどは氏名と年齢を出力する関数のプログラムを作成しました。似たようなプログラムになりますが、今回は**高校生の同じクラスの出席番号と氏名と年齢を表示**するプログラムを作成してみます。<font color="#00cccc">chap06</font>の中に、<font color="#00cccc">samp06-03-02.py</font>というファイル名でファイルを作成し、以下のコードを書いてください。

```samp06-03-02.py
def classmate_func(No, last_name, first_name, age):
    print(f'出席番号：{No}、氏名：{last_name} {first_name}、年齢：{age}歳')

print('関数を呼び出します。')
classmate_func(7, '川崎', '淳平', 17)
classmate_func(13, '立原', '春樹', 17)
classmate_func(21, '松本', '祐希', 17)
```
><font color="#090" bgcolor="black">【実行結果】</font>
関数を呼び出します。
出席番号：7、氏名：川崎 淳平、年齢：17歳
出席番号：13、氏名：立原 春樹、年齢：17歳
出席番号：21、氏名：松本 祐希、年齢：17歳

出力結果については、先ほどとほぼ同じプログラムですので、問題はないかと思います。ここで見てほしいのが、年齢（**17歳**）のところです。
今回の条件では、**「高校生の同じクラスの」**となっているので、基本的には年齢は一緒になるはずです。（誕生日の事情など、一部事情により年齢が異なることも考えられますが、それについてはこのあと触れます。）

こういう時に、いちいち年齢を指定するのも面倒なので、あらかじめデフォルト値として指定しておくことができます。先ほど書いたプログラムを以下のように修正してください。
<font color="orange">※</font>関数の呼び出し元における実引数の数も3つに減っていることにも注意してください）

```samp06-03-02.py
def classmate_func(No, last_name, first_name, age=17):
    print(f'出席番号：{No}、氏名：{last_name} {first_name}、年齢：{age}歳')

print('関数を呼び出します。')
classmate_func(7, '川崎', '淳平')
classmate_func(13, '立原', '春樹')
classmate_func(21, '松本', '祐希')
```
><font color="#090" bgcolor="black">【実行結果】</font>
関数を呼び出します。
出席番号：7、氏名：川崎 淳平、年齢：17歳
出席番号：13、氏名：立原 春樹、年齢：17歳
出席番号：21、氏名：松本 祐希、年齢：17歳

結果は先ほどと同じですが、実引数の個所に**17**と指定していません。しかし、出力結果にはそれぞれ**「年齢：17歳」**と指定しています。
これは、呼び出される**classmate_func関数**の仮引数の個所に注目すると、classmate_func(No, last_name, first_name, **age=17**)となっており、この**age=17**により、あらかじめ関数内ではage=17という値が入っているのです。

こういった引数を<font color="#0c9">**デフォルト引数**</font>と言います。

また、デフォルト引数は**あくまでデフォルトなので、上書きすることは可能**です。先ほど書いたプログラムを以下のように修正してください。
<font color="orange">※</font>関数の呼び出し元の「立原 春樹」の実引数を変えています。

```samp06-03-02.py
def classmate_func(No, last_name, first_name, age=17):
    print(f'出席番号：{No}、氏名：{last_name} {first_name}、年齢：{age}歳')

print('関数を呼び出します。')
classmate_func(7, '川崎', '淳平')
classmate_func(13, '立原', '春樹', 18)
classmate_func(21, '松本', '祐希')
```
><font color="#090" bgcolor="black">【実行結果】</font>
関数を呼び出します。
出席番号：7、氏名：川崎 淳平、年齢：17歳
出席番号：13、氏名：立原 春樹、年齢：18歳
出席番号：21、氏名：松本 祐希、年齢：17歳

##最後に
今回はキーワード引数やデフォルト引数について触れました。引数が複数になった際にどの引数が対応していたかをよく失念してしまうことがあるため、そういった際にキーワード引数を使うと失念せずに済みます。またデフォルト引数もAIのプログラムを書く際にたまに登場することがありますので、押さえておきましょう。

なお、基本情報技術者試験ではキーワード引数やデフォルト引数が出題される可能性もありますので、試験を受ける予定の方は必ず押さえておきましょう。

###[【目次リンク】へ戻る](https://qiita.com/ko0821/items/379e8bd9e6ea01089419)