0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-06-17

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

##キーワード引数
まずは、キーワード引数の説明になります。いきなりですが、chap06の中に、samp06-03-01.pyというファイル名でファイルを作成し、以下のコードを書いてください。
なお、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)

【実行結果】
氏名:山田 一郎、年齢:19歳
氏名:山田 二郎、年齢:17歳
氏名:山田 三郎、年齢:14歳

まず、前節で細かくは説明していなかったのですが、関数を呼び出す際に、以下のように指定した実引数は仮引数に渡す際に、左から順番を変更することなく渡しています。
'山田'が仮引数のfirst_nameに渡されることはないということです。)
image.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)

【実行結果】
氏名:山田 一郎、年齢:19歳
氏名:山田 二郎、年齢:17歳
氏名:山田 三郎、年齢:14歳

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

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

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)

【実行結果】
関数を呼び出します。
出席番号:7、氏名:川崎 淳平、年齢:17歳
出席番号:13、氏名:立原 春樹、年齢:17歳
出席番号:21、氏名:松本 祐希、年齢:17歳

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

こういう時に、いちいち年齢を指定するのも面倒なので、あらかじめデフォルト値として指定しておくことができます。先ほど書いたプログラムを以下のように修正してください。
関数の呼び出し元における実引数の数も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, '松本', '祐希')

【実行結果】
関数を呼び出します。
出席番号:7、氏名:川崎 淳平、年齢:17歳
出席番号:13、氏名:立原 春樹、年齢:17歳
出席番号:21、氏名:松本 祐希、年齢:17歳

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

こういった引数をデフォルト引数と言います。

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

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, '松本', '祐希')

【実行結果】
関数を呼び出します。
出席番号:7、氏名:川崎 淳平、年齢:17歳
出席番号:13、氏名:立原 春樹、年齢:18歳
出席番号:21、氏名:松本 祐希、年齢:17歳

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

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

###【目次リンク】へ戻る

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?