【学習記録】Pythonの*argsについて勉強

今の現場でPythonが使われていて、コードの中で時々目にする*argsがよくわからなかったので勉強しました。
結論から言うと*(アスタリスク)がついた引数は可変長引数になるとのことでした。
記事をググりながら自分でも手を動かしましたのでメモします。

参考にさせてもらった記事はこちらです。

note.nkmk.me

記事の中で*argsを使った例として以下のコードが記載されていてわかりやすかったです。

def my_sum(*args):
    return sum(args)

print(my_sum(1, 2, 3, 4))
# 10

print(my_sum(1, 2, 3, 4, 5, 6, 7, 8))
# 36

my_sum関数の引数を可変にすることで引数を4つ渡した時も8つ渡した時も正常に動作しています。

記事を見て頭で理解するだけだとあんまり記憶に定着しないので、自分のローカルでもコードを書いてプログラム実行してみました。想定通りに動きました。

f:id:JunpeiNakasone:20210303224909p:plain

あと記事の中で以下のコードを例に*argsはタプルとして受け取られているという説明があったのですが

def my_sum2(*args):
    print('args: ', args)
    print('type: ', type(args))
    print('sum : ', sum(args))

my_sum2(1, 2, 3, 4)
# args:  (1, 2, 3, 4)
# type:  <class 'tuple'>
# sum :  10

自分がタプルってなんだっけ状態だったのでドキュメントを調べてみました。

docs.python.org

すると以下の説明がありました。

タプルはリストと似ていますが、たいてい異なる場面と異なる目的で利用されます。タプルは 不変 で、複数の型の要素からなることもあり、要素はアンパック(この節の後半に出てきます)操作やインデックス (あるいは namedtuples の場合は属性)でアクセスすることが多いです。一方、リストは 可変 で、要素はたいてい同じ型のオブジェクトであり、たいていイテレートによってアクセスします。

なるほど。タプルとリストはほぼ同じデータ型だけど、タプルは不変でリストは可変という違いがある、という違いがあるようです。

引き続き手を動かしながら理解を深めていきます。