Python 可変長引数

Pythonでは、関数に渡す、定義する引数(実引数、仮引数)の中に可変長引数というものがあります。

可変長引数とは

通常、引数は、定義した個数のみを扱います。しかし、中には渡したい引数が決まっていない場合もあると思います。

そうした時に活躍するのが可変長引数です。

言葉の通り、任意の数の引数を指定できます。

方法

関数の定義時に変数前に1つ或いは2つのアスタリスク(*)をつけることで可変長引数にすることができます。

1つのアスタリスクにすると複数の位置引数をタプルとして受け取ります。

2つのアスタリスクにすると複数のキーワード引数を辞書として受け取ります。

位置引数やキーワード引数についてこちらの記事を参照ください。

因みに複数の引数をリストとして受け取りたい場合は、複数の引数をまとめたリストを作成し、そのリストを関数に渡す形になります。アスタリスクはいりません。

或いは、変数前に1つのアスタリスクをつけること(可変長引数)でタプルからリストに変換する方法もあります。

具体例

タプルとして受け取る

変数前に1つのアスタリスクをつける可変長引数は、受け取った引数(実引数)をタプルとして受け取ります。

def func(*args):
    print(args)
    print( type(args) )
    print( len(args) )

func(1,2,3,4,5,6,7,8,9)

#結果
(1, 2, 3, 4, 5, 6, 7, 8, 9)
<class 'tuple'>
9

位置引数+可変長引数

def func(a1,a2,*args):
    print(a1)
    print(a2)
    print(args)

func(1,2,3,4)
#結果
1
2
(3,4)
func(1,2)
1
2
()

位置引数より多い実引数を可変長引数argsが受け取っています。

ない場合は、空のタプルが生成されます。

キーワード引数+可変長引数

可変長引数を前に定義する場合、キーワード引数を指定しないとエラーメッセージがでます。

なぜなら、可変長引数の後の引数は、明示的に指定しないと全て可変長引数として取り込まれてしまうからです。

def func(*args, a1, a2):
    print(a1)
    print(a2)
    print(args)

func(1,2,3,4)
#結果
TypeError: func() missing 2 required keyword-only arguments: 'a1' and 'a2'

func(1,2,a1=3,a2=4)
#結果
3
4
(1,2)

辞書として受け取る

変数前に2つのアスタリスクをつける可変長引数は、 受け取った引数(実引数)を辞書として受け取ります。

しかし、実引数はキーワード引数でなければなりません。

def func(**args):
    print(args)
    print(type(args))
    print(len(args))

func(key1=1,key2=2,key3=3,key4=4)
#結果
{'key1': 1, 'key2': 2, 'key3': 3, 'key4': 4}
<class 'dict'>
4

位置引数+可変長引数

def func(a1,a2,**args):
    print(a1)
    print(a2)
    print(args)

func(0,1,key1=1,key2=2,key3=3,key4=4)
#結果
0
1
{'key1': 1, 'key2': 2, 'key3': 3, 'key4': 4}

func(0,1)
#結果
0
1
{}

キーワード引数を可変長引数argsが受け取っています。

ない場合は、空の辞書が生成されます。

辞書の場合、可変長引数を前に定義するとエラーメッセージがでます。

したがって、辞書の場合、可変長引数を位置引数より前に定義することはできません。

def func(**args,a1,a2):
    print(a1)
    print(a2)
    print(args)

func(key1=1,key2=2,key3=3,key4=4,0,1)
#結果
 SyntaxError: invalid syntax