Pythonの関数で引数をタプルや辞書に格納するときに使う「*args」「**kwarga」について詳しく解説していきます。
可変長引数を理解すると、関数を実行する状況によって引数の長さが変わる場合に対応できるようになります。
そのためには位置引数やキーワード引数を知っている必要があるので以下の記事からご確認ください。
Pythonの関数を実行するときに必要な引数についての解説です。呼び出し方によって位置引数とキーワード引数に分けられます。今回はそれらの違いを見ていきましょう。 もし関数や引数の基本について知りたいという方は以下の記事をご覧ください[…]
そもそも関数とは何か?関数を定義する方法などの基本的な内容を知りたい方は以下の記事をご覧ください。
プログラミングをするうえで関数を扱うことは必須です。Pythonでは組み込み関数と言われる便利なものが最初から備わっていますが、自分で関数を定義することもできます。 今回は関数を定義する方法からコメントの書き方などの基本的なルールを[…]
可変長引数
可変長引数とは引数の長さ(数)が変わっても対応できる引数のことです。位置引数で渡されたものをタプルに格納する方法と、キーワード引数で渡されたものを辞書に格納する方法がります。
引数タプルとは
位置引数をタプルに格納することができます。もちろんタプルなので関数に渡した順番で格納されます。
「*args」で定義する
1 2 3 4 5 6 7 8 9 |
def menu(when, *args): print(when, 'に', 'と'.join(args) ,'を食べた') print(args) menu('朝', 'コーヒー', 'パン') #出力結果 朝 に コーヒーとパン を食べた ('コーヒー', 'パン') |
1行目の定義文には「when, *args」と書かれており、5行目の実行文には引数として「’朝’, ‘コーヒー’, ‘パン’」が渡されています。
このとき「when」には「’朝’」、「*args」には「’コーヒー’, ‘パン’」がタプルとして格納されます。それがprint関数で表示されています。
次のように引数が増えた場合も同様にタプルに格納されます。引数の数(長さ)が変わっても対応できるところが素晴らしいですね。
1 2 3 4 5 |
menu('朝', 'コーヒー', 'パン', 'バナナ') #出力結果 朝 に コーヒーとパンとバナナ を食べた ('コーヒー', 'パン', 'バナナ') |
引数辞書とは
キーワード引数を辞書に格納することができます。キーワード引数を格納するので「kwarg=value」の形で与えられたものになります。
「**kwargs」で定義する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
def family(father, mother, *args, **kwargs): print('father:', father) print('mother:', mother) print('children:', '・'.join(args)) for kw in kwargs: print(kw, ':', kwargs[kw]) print(args) print(kwargs) family('太郎', '花子', 'たかし', 'ゆうこ', gfather='次郎',gmother='ひろこ') #出力結果 father: 太郎 mother: 花子 children: たかし・ゆうこ gfather : 次郎 gmother : ひろこ ('たかし', 'ゆうこ') {'gfather': '次郎', 'gmother': 'ひろこ'} |
この例ではfamily関数を定義してみました。このとき「fahter, mother」は必ず必要な引数なので、「太郎、花子」を渡しています。
その後ろの「*args」には「たかし、ゆうこ」を渡しています。また、「**kwargs」には「gfather=’次郎’,gmother=’ひろこ’」のようにキーワード引数の形で渡しています。これがキーとバリューで辞書に格納されることになります。
そうすると、上の出力結果のようになります。最後の2行を見るとargsがタプルで、kwargsが辞書になっていることが分かりますね。
もちろん、引数の数が増えても対応できるのでいろいろ試してみてください。
「*args」→「**kwargs」の順番で定義しないとエラーが出ます。
定義での注意点
引数タプルと辞書を定義するときに「*args」と「**kwargs」を使うと説明していますが、正確にはアスタリスク(*)で区別されます。
- 「*」で引数タプル
- 「**」で引数辞書
となります。つまり「args」「kwargs」はタプルや辞書の名前ですから何でもOKです。
「*spam」ならタプルになりますし、「**baconn」なら辞書になります。ですが、多くの場合「args」や「kwargs」という名前になっているので今回もそのように解説しています。
まとめ
- 可変長引数は引数タプルと引数辞書に分けられる
- 「可変長」なので引数の長さが変わってもOK
- 引数タプルとは「*args」で定義される
- 与えられた引数をタプルに格納する
- 引数辞書とは「**kwargs」で定義される
- 「kwarg=value」で与えられた引数を辞書に格納する
- 定義するときは「*args」 → 「**kwargs」の順で行う
今回は少しややこしい内容だったかもしれませんが、プログラミングでは必ず出会うことになるキーワードなので、正確に理解しておきましょう。参考になれば幸いです。
プログラミング言語のなかでも人気の高いPythonを学習する教材を紹介します。 最近ではプログラミングスククールがたくさんあるので迷うと思います。 ですが、まずは無料教材から始めてみましょう。苦労した分だけ力がつきます。 […]