Pythonでは関数の引数に *
や **
を指定すると可変個の引数を扱うことができます.具体的には関数定義時の引数を *args
と記述すると,関数内部では args
というタプルに位置引数がまとめられます.また関数定義時の引数を **kwargs
とすると,関数内部では kwargs
という辞書にキーワード引数がまとめられます.なお,必ずしも args
や kwargs
という名前でなくても構いませんが,慣習的にそれらの名前が使われます.
可変個の位置引数を使った関数 greetings
を定義して呼び出してみます.関数の呼び出しでは3つの引数が指定されていますが,2個目と3個目の 'Tony'
と 'Bob'
が args
タプルにまとめられていることが分かります.
def greetings(msg, *args):
print(msg)
print(args)
print(type(args))
greetings('Hello', 'Tony', 'Bob')
Hello ('Tony', 'Bob') <class 'tuple'>
'Tony'
と 'Bob'
への挨拶文を作成してみます.
def greetings(msg, *args):
for name in args:
print(f'{msg}, {name}!')
greetings('Hello', 'Tony', 'Bob')
Hello, Tony! Hello, Bob!
'Alice' も加えて3人への挨拶文を作成します.
greetings('Hello', 'Tony', 'Bob', 'Alice')
Hello, Tony! Hello, Bob! Hello, Alice!
可変個のキーワード引数を利用したい場合には **kwargs
を利用します.kwargs
が辞書型であることが分かります.
def signature(name, **kwargs):
print(name)
print(kwargs)
print(type(kwargs))
signature('Bob', street='Minato', city='Kobe')
Bob {'street': 'Minato', 'city': 'Kobe'} <class 'dict'>
手紙の署名を出力するような関数に変更してみましょう.
def signature(name, **kwargs):
print(name)
for key, value in kwargs.items():
print(f'{value} {key},', end=' ')
print('')
signature('Bob', street='Minato', city='Kobe', prefecture='Hyogo')
Bob Minato street, Kobe city, Hyogo prefecture,