Python

【Python】*args, **kwargsとは?可変長引数についてわかりやすく説明!

こんにちは、まさかめです。

Pythonにおいて「*args」「**kwargs」を見たことはありますか?

一見さんお断り感の強いこれらは初めて見ると複雑で難しいものに思えてしまうかもしれませんが、理解さえしてしまえば何ら難しいものではありません。

今回は「*args」,「**kwargs」の紹介をしていきます。

*args, **kwargsとは?

argsとkwargsは、それぞれ以下の英単語から来ています。

args     :arguments(引数)
kwargs :keyword arguments(キーワード引数)

argumentsは引数を意味する英単語であり、
kwargsはargumentsにkeywordのkwがついたものです。

 

pythonにおいてargsとkwargsは可変長引数を表す際によく用いられます。

可変長引数としての*args, **kwargs

悩んでる人
悩んでる人
さっき出てきた可変長引数って何…?
まさかめ
まさかめ
可変長引数は引数を好きなだけ設定できる引数だよ!

まず、pythonにおいて「*args」「**kwargs」は、関数が引数を受け取る際の方法の1つに過ぎません。

そのため、以下におけるwordと同じようなものです。

def display_arguments(word):
  print(word)

 

*args

まず*argsについて解説していきます。

以下のような引数で受け取った値を表示する関数を例に考えていきます。

def display_arguments(word):
  print(word)

display_arguments(“Hello!”)の場合、出力はそのまま「Hello!」です。
このとき、display_arguments(“Hello!”, “World!”)のように複数の引数を使用することはできません。

まさかめ
まさかめ
関数を定義するときに引数を1つしか定義していないからね!

 

しかし、後から引数を複数使用したい場合もあります。
そういった際に便利なのが可変長引数という、使用する引数の数を明確に定義しない方法があります。

書き方は以下のように*を使用します。

def display_arguments(*word):
  print(word)

これならdisplay_arguments(“Hello!”, “World!”)でもOKというわけです。

 

今回は「*word」という引数を用いましたが、
「word」の部分は何でもOKです。

そして、その表記に慣習的に使用されるのが「*args」であり、
「何個でも引数を入れてOK」という意味になります。

 

注意点として、*wordという引数の定義では以下のようなキーワード引数を受け取ることはできません。

display_arguments(one="hello",two="world")

そのため、キーワード引数を使用したい場合は次に紹介する**kwargsを使用します。

 

**kwargs

**kwargsも先程の*argsと考え方はほぼ同じです。

*argsでは使用できなかったキーワード引数に対応したものが
**kwargsという認識でOKです。

 

先程の例で登場した以下関数では、display_arguments(one=”hello”,two=”world”)のようにキーワード引数を受け取ることはできませんでした。

def display_arguments(*word):
  print(word)

 

そこで、登場するのが**kwargsであり、引数の前に*を2つ書くことが重要です。
そのため、kwargsは別の文字でも構いません。

def display_arguments(**word):
  print(word)

*argsの際に紹介した関数の引数部分から*がさらに増え、2つになりました。

この状態だと、display_arguments(one=”hello”,two=”world”)のようなキーワード引数を受け取ることができます。

しかし、先程の*argsでは可能だった位置引数は受け取れませんので注意が必要です。

まとめ

argsやkwargs自体に意味はない
*もしくは**を引数の前に書くと可変長引数になる

今回の内容をまとめると上記になります。

可変長引数について理解しておけば*argsや**kwargsといった一見難しそうに見えるコードも理解することができます。

使えるようになれば便利な引数ですので、ぜひ一度しっかり学んでおきましょう!