Pythonの可変長引数を徹底解説
スポンサードリンク
おはようございます。Shotaです。
今回の記事は、Pythonで使われる可変長引数について詳細に解説します。
はじめに
可変長引数とは、関数の引数の個数が予め決まっているわけではなく、任意の個数となっている引数のことを指します。Pythonでは*
(アスタリスク)を使って、*args
や**kwargs
のように表記します。
ちなみに、args
とkwargs
のそれぞれの正式名称は以下の通りです。
args
:argumentskwargs
:keyword arguments
argumentsは引数という意味です。
*args
def show_args(*args): print(args) show_args(1, 3, 5) show_args('a', 'b', 'c', 'd') show_args('Shota', 'Nameless', True)
▼出力結果
(1, 3, 5) ('a', 'b', 'c', 'd') ('Shota', 'Nameless', True)
Pythonにおける*args
は、複数の引数をタプルとして出力します。タプルは基本的にリストと似ていますが、中に入っている要素を追加・変更や削除できません。
この関数の代わりに、以下のような関数を用意してタプルを使って表示しても結果は同じです。
def samplefunc(args): print(args) t = (1, 3, 5) samplefunc(t)
(1, 3, 5)
この自動的にタプルを出力することを利用して、以下のようなプログラムを書けます。次のプログラムは、可変長引数*args
にある引数全ての積を出力します。
def multiply(*args): z = 1 for number in args: z *= number print(z) multiply(2, 7) multiply(4, 7, 19) multiply(13, 11, 23, 31)
▼出力結果
14 532 101959
このように*args
を活用することで、関数内でキーワード以外の様々な引数を受け付けるより柔軟なコードを作成できます。あと、*args
を実際にプログラムで使う時はアスタリスクを必ず前につけてください。アスタリスクがないと可変長引数として認識されないでの要注意。
あと、引数の名前はargs
と書かれていますが、名前は何でもかまいません。(第三者がプログラムを読める範囲までは)
**kwargs
**kwargs
は、簡単に言えばキーワード付きの可変長引数の辞書を関数に渡すために出力されます。*args
と同様に、**kwargs
はいくつでも引数を受け取れます。しかし、*args
とは異なってキーワードを割り当てる必要があります。
以下のようにして可変長引数**kwargs
を出力できます。
def print_kwargs(**kwargs): print(kwargs) # 「キー=値」と表記して出力させる。逆にこう書かなければエラーが発生する print_kwargs(val_1='Kento', val_2=10, val_3=True, val_4=100)
▼出力結果
{'val_1': 'Kento', 'val_2': 10, 'val_3': True, 'val_4': 100}
あと、辞書として出力されるのを利用してこんな書き方もできます。
def show_goods(**kwargs): for key, value in kwargs.items(): print(f'Item: {key}, Price: ${value}') show_goods( apple=10, banana=15, natto=1, wheat=20, juice=4, cheese=5, cake=2, cookie=4 )
▼出力結果
Item: apple, Price: $10 Item: banana, Price: $15 Item: natto, Price: $1 Item: wheat, Price: $20 Item: juice, Price: $4 Item: cheese, Price: $5 Item: cake, Price: $2 Item: cookie, Price: $4
補足
これまで*args
と**kwargs
をそれぞれ詳細に解説しました。実は、これらの引数は同時に扱うことができます。
def show_values(val, *args, **kwargs): print(val, args, kwargs) show_values('Shota', 'student', 21, sex='male', job='developer')
▼出力結果
Shota ('student', 21) {'sex': 'male', 'job': 'developer'}
ただし、関数で可変長引数を扱う場合は「引数→可変長引数(*args
)→可変長引数(**kwargs
)」の順番を遵守してください。この順番が守られていないとSyntaxError
が発生します。
あと、*args
と**kwargs
は関数の出力でもよく利用されます。
def some_args(arg_1, arg_2, arg_3): print(f'arg_1: {arg_1}') print(f'arg_2: {arg_2}') print(f'arg_3: {arg_3}') # NOTE: 可変長引数を扱う際に、データ型の一致をする。不一致が起こればTypeErrorが発生する args = ('a', 'b', 'c') some_args(*args)
▼出力結果
arg_1: a arg_2: b arg_3: c
def some_kwargs(kw_1, kw_2, kw_3): print(f'kw_1: {kw_1}') print(f'kw_2: {kw_2}') print(f'kw_3: {kw_3}') # NOTE: 出力させる前とその後で型を一致させる。 kwargs = { 'kw_1': 10, 'kw_2': 100, 'kw_3': 1000 } some_kwargs(**kwargs)
kw_1: 10 kw_2: 100 kw_3: 1000
まとめ
今回の記事では、Pythonの可変長引数(*args
と**kwargs
)を詳細に解説しました。
*args
と**kwargs
を受け付ける関数は、引数リスト内の入力数が比較的少ないと予想される際に使うと良いでしょう。しかし、*args
と**kwargs
を使う際には多少注意する必要があります。
今回の記事はこれで終了です。