べくとりうむ.py Written by TicTak(※現在ブログ工事中のため、見づらい点があり申し訳ないです)

【Python Coding】関数の可変長引数(*args,**kwargs)を解説

code python

こんにちは、TAKです。

「pythonの関数引数に出てくる*argsや**kwargsって何なの?」って思ったことはありませんか?
今回は、この可変長引数と呼ばれる*argsや**kwargsの意味と使い方について紹介します。

初心者の時は知らなくてもさほど支障はなかったと思いますが、使い方を知っておくとかなり使える手法なので、より高みを目指したい方は参考にしてみてください。

可変長引数(*args,**kwargs)とは何か?

*argsはタプル型、**kwargsは辞書型を受け取る

まず、この*argsや**kwargsという名前自体はあまり重要ではなく、名前よりもアスタリスク(*や**)の数の方が重要となります。argsやkwargsという名前は慣例的に使われるためこうなっているそうです。

そして、*argsと**kwargsの違いをまとめると以下のようになります。

● アスタリスクが1つ(*args)  : 関数の引数としてタプル型を受け取る場合

● アスタリスクが2つ(**kwargs) : 関数の引数として辞書型を受け取る場合

目的に応じて色々な関数を作ることがあると思いますが、タプル型のデータを引数にしたい時は関数引数として*argsを設定し、辞書型のデータを引数にしたい時は関数引数として**kwargsを設定すればOKということです。

pythonのコードで確認してみる

言葉だけで説明しても今一つイメージ湧かないと思うので、コードを見てみましょう。
まずは、可変長引数を受け取れて中身を確認出来る関数を定義してみます。

可変長引数「*args」「**kwargs」の内容を確認するための関数

関数を定義したら、タプルだけを渡した場合、辞書型だけを渡した場合、両方渡した場合の3つのケースを見て結果を確認してみたいと思います。

【python Case1】タプルだけを渡した場合

関数にタプルだけを渡した場合の結果

先ほどの関数に簡単なタプルを渡してみた結果が上記になります。
class tupleとして値(1,2,3)が認識されているのがわかりますね。
同時に、class dictの方には何も値が認識されていないのもわかります。

タプル型を渡すと、関数側*argsの引数が反応しているということです。

【python Case2】辞書型だけを渡した場合

関数に辞書型だけを渡した場合の結果

次に、 先ほどの関数に簡単な辞書型データを渡してみた結果が上記になります。
class dict側には、指定した値が辞書型として認識されているのに対して、class tuple側は何も値が認識されていないのがわかります。

辞書型を渡すと、関数側**kwargsの引数が反応しているということです。

【python Case3】両方渡した場合

ではタプル型と辞書型の両方を渡した場合はどうなるか見てみましょう。
先ほどは関数呼び出し時に値を直接入力していましたが、以下では変数を渡すようにしています。
辞書型を渡す際にはアスタリスク2つ付ける必要(**)がある点に注意です。

【正】タプル型と辞書型を両方渡した場合

上記の結果からわかるように、タプル型を渡せば*argsが反応し、辞書型を渡せば**kwargsが反応していることが確認出来ますね。関数呼び出し時に引数の前にアスタリスク(**)をつけていますが、もしつけないと以下のようになってしまいます。

【誤】タプル型と辞書型を両方渡した場合

可変長引数(*args,**kwargs)の使い方を紹介

必要ライブラリのインポート(共通)

ここからは、具体的にどんな感じで使えるのかを見ていきたいと思います。
まずは必要なライブラリのインポートをしておきます。
今回使うのは、pandasとnumpyとrandomの3つです。

今回使うライブラリのインポート

*argsの使い方

では実際に、どのようにして活用出来るのかを簡単に見ていきましょう。
個人的には辞書型を使うケースの方が多いですが、タプル型だと以下のように数値を受け取り、その統計量(以下では合計と平均値)を算出するようなイメージで使えるかと思います。

*argsを引数として受け取る関数の定義

上記のように関数を定義したら、あとは何かしらの数値を与えてみましょう。
ここでは、numpyを使って1から100までの数値をまとめて渡しています。

1から100までの数値を渡した場合の結果

結果、合計値と平均値が適切に算出出来ているのが確認出来るかと思います。
大量の数値をまとめて受け取り、その演算結果や統計量を返したい場合には使える方法ですね。

**kwargsの使い方

次に、辞書側を渡して処理結果を返すような例を見てみましょう。
ここでは、辞書型データを受け取り、それをそのままデータフレームに変換する関数を定義しています。

**kwargsを引数として受け取る関数の定義

pandasを使ったデータフレームの作り方が今一つわからない方は、以下の記事を参考にしてみてください。

関数を定義したら、あとは辞書を作成して渡すだけです。
ここでは、IDとプログラミング言語名を10個ほど作成して渡し、その先頭5行のみを表示しています。

辞書型{ID:プログラミング言語名}を渡してデータフレームを作成した結果

結果、渡した辞書型の内容に従ったデータフレームが作成出来ているのが確認出来るかと思います。
データフレームに限らず、辞書型を何かしらの形で展開したいような場合に使える方法ですね。

さいごに

今回は、pythonの可変長引数である*argsと**kwargsについて概要と使い方を中心に解説してきました。

そもそもの意味と使い方のポイントがわかれば大して難しくないので、あとは自分の実現したい目的に応じて自由に関数を定義して使いこなしてみてください。

ではでは~