▶ 自作関数の作り方や引数の渡し方に関する記事は以下を参考にしてください。
はじめに
今回は「*args」と「**kwargs」について扱います。これまで自作関数の作り方や引数の渡し方を扱ってきました。関数に渡す引数の数は必ずしもあらかじめ決まっているものばかりではありません。たとえばprint()関数は引数が1つでも、2つでも問題なく動きますね。このように不特定多数の引数を受け取ることができる仕組みを作るのが「*args」「**kwargs」です。今回はこの2つを学んでいきましょう。
不特定多数のargument(引数)を受け取る
関数が不特定多数の引数を受け取れるようにする仕組みがあります。関数呼び出し時にカンマ区切りで引数を指定すると、関数内でタプルとして扱うことができるのが「*args」です。一方、関数呼び出し時にkeyとvalueの組み合わせで引数を指定すると、関数内で辞書として扱うことができるのが「**kwargs」です。この説明だけではわかりにくいかと思いますので、一つずつ、コードを書きながら確認していきましょう。
*args
簡単な関数を定義して確認していきましょう。「*args」を使って定義した関数が複数の引数を受け取ると、関数内で引数を「タプル」として保持していることを確認してみましょう。
# 不特定多数の引数を受け取る関数
def print_values(*args):
print(args)
# 複数の引数を指定して関数を呼び出し
print_values(47,34,31,68)
このように関数定義時に「*args」を用いると不特定多数の引数を渡すことができ、関数内では「args」に引数がタプルで保持されています。この例では引数を4つ指定していますが、これがいくつに増えてもこの関数は動きます。
関数内でタプルで引数を保有していることで、たとえば次のように値を取り出して利用することができます。
# 不特多数の指定された引数の和を計算する関数
def sum_values(*args):
sum=0
flg=0
for arg in args:
# 引数が数字であるかを判定
if str(arg).isdigit():
sum+=arg
else:
print('引数には数字を指定してください')
flg+=1
break
# 引数がすべて数字の場合のみ合計を表示する
if flg==0:
print(sum)
# 複数の引数を指定してsum_values関数を呼び出し
sum_values(47,34,31,68)
はじめは複雑に感じるかもしれませんが、慣れればどうということはないですね。そして便利ですね!ちなみに「*args」で紹介していますが、「args」の部分は何でも構いません。パラメータの前に「*」がつけること、関数内では「*」をとった形で指定するとタプルとして引数が管理されていることを抑えておいてください。
**kwargs
続いて、「**kwargs」についても確認していきましょう。こちらも簡単な関数を定義して進めていきます。
# 不特定多数の引数を辞書形式で扱う
def print_values_dic(**kwargs):
print(kwargs)
# 関数を呼び出す
print_values_dic(param1=100,param2=40,param3=15)
このように関数の定義では個々のパラメータを指定していなくても、関数の呼び出し時にkeyとvalueの組み合わせを渡すことができます。渡されたkeyとvaluesの値は辞書形式で保有されます。
関数の引数が多いときに、とりあえず「**kwargs」で記載しておいて、関数の中で引数をとってくる、というような書き方をすることもあるので覚えておくとよいでしょう。
# 不特定多数の引数を辞書形式で扱う
def print_values_dic(**kwargs):
param1=kwargs.get('param1',1)
param2=kwargs.get('param1',2)
param3=kwargs.get('param1',3)
print(f'param1は{param1},param2は{param2},param3は{param3}')
# 関数を呼び出す
print_values_dic(param1=100,param2=40,param3=15)
このコードは、引数を5つ指定してもエラーとならずに動きます。
# 引数を5つ指定して関数を呼び出す
print_values_dic(param1=100,param2=40,param3=15,param4=45,param5=100)
このように関数内で実際に使用しているのはparam1~param3の3つですが、関数呼び出し時に5つの引数を渡してもエラーとはならずに正常に動作しますね。
まとめ
今回は*argsと**kwargsについて解説しました。関数には不特定多数の引数を渡す仕組みがあります。カンマ区切りで不特定多数の引数を渡すようにしたのが「*args」、keyとvalueのセットで不特定多数の引数を渡すようにしたのが「**kwargs」です。関数内では「*」や「**」を外して「args」には引数がタプルで、「kwargs」には引数が辞書形式で格納されているのでしたね。
コメント