Pythonでの関数の引数の使い方を見てきましたが、複数の引数をまとめて扱う方法があります。
アスタリスクを使って位置引数をタプル化することと、キーワード引数を辞書化することです。
このタプル化、辞書化のそれぞれの方法について見ていこうと思います。
アスタリスク(*)で位置引数のタプル化
それではPythonでの位置引数のタプル化についてやっていきましょう。
まず位置引数のコードを考えてみます。すでにやっていることなので理解できると思います。
def mobile_suit(ms1, ms2, ms3):
print(ms1)
print(ms2)
print(ms3)
この関数の引数は位置引数になっています。引数にガンダム、ガンキャノン、ガンタンクと入れて実行すると次のように出力されますね。(ファイル名をasterisk.pyでAtomで実行しています。ちょっと引数の値で遊んでいますw)
この関数定義の3つの引数を一つにまとめて書き換えるとこう書くことができます。(関数の呼び出しも合わせて書いています)
def mobile_suit(*args):
for arg in args:
print(arg)
mobile_suit("ガンダム", "ガンキャノン", "ガンタンク")
アスタリスク(*)を使ってargsという引数でまとめています。このargsはPythonで慣習的に指定されています。
*argsで引数がまとめられて、それをargの変数にfor文で順に取り出して出力してみます。実際に実行するとこうなります。
このコードは、位置引数とタプルを使って次のようにも書くことができます。
def mobile_suit(ms, *args):
print(ms)
for arg in args:
print(arg)
t = ("ガンキャノン", "ガンタンク")
mobile_suit("ガンダム", *t)
関数の引数に位置引数と、*argsを使っています。tというタプルを作って、関数を呼び出す時に*argsの位置にこのタプルを入れて実行しています。
このように*argsにタプルを使って引数を展開することができます。
アスタリスク(**)でキーワード引数の辞書化
次はキーワード引数の辞書化についてやっていきましょう。
こちらもまずキーワード引数のコードを考えてみます。
def food(breakfast="卵焼き", lunch="サンドウィッチ", dinner="ハンバーグ"):
print(breakfast, lunch, dinner)
food(breakfast="卵焼き", lunch="焼き飯", dinner="ステーキ")
呼び出す時に、lunchとdinnerの値を変えて呼び出しています。実行するとこうなります。
値が変更されて出力されているのがわかります。
この関数定義の3つのキーワード引数を一つにまとめてこう書き換えてみます。(関数の呼び出しも合わせて書いています)
def food(**kwargs):
print(kwargs)
food(breakfast="卵焼き", lunch="焼き飯", dinner="ステーキ")
これは引数をアスタリスク(**)とkwargsででまとめています。このkwargsはPythonで慣習的に指定されています。
これを実行すると次のように辞書型で出力されます。
これは、キーと値を取り出す形で次のように書き換えることもできますね。
def food(**kwargs):
for k, v in kwargs.items():
print(k, v)
food(breakfast="卵焼き", lunch="焼き飯", dinner="ステーキ")
実行するとこうなります。
このコードは、辞書を変数として使って次のように実行することができます。
def food(**kwargs):
for k, v in kwargs.items():
print(k, v)
d = {"breakfast": "卵焼き", "lunch": "焼き飯", "dinner": "ステーキ"}
food(**d)
関数の引数に**kwargsがありますが、ここにdという辞書を作って、関数を呼び出す時に**kwargsの位置にこの辞書を入れて実行するコードになっています。
このように**kwargsに辞書を使って引数を展開することができます。
位置引数、タプル化、辞書化を全て組み合わせる
ここまでやってきた位置引数、タプル化、辞書化を全て組み合わせて使うコードをやってみましょう。
def gundam(ms, *args, **kwargs):
print(ms)
print(args)
print(kwargs)
gundam("ガンダム", "ガンダムMkⅡ", "Zガンダム", ra_cailum="νガンダム", rewloola="サザビー")
関数の引数に、位置引数、*args、**kwargsを指定して順にprint()で出力するコードになっています。
関数を呼び出すコードの引数に、複数の引数とキーワード引数を使っています。
実行するとこうなります。
最初の引数は位置引数として、次の二つの引数はタプル化されて、次の二つのキーワード引数は辞書化されて、それぞれが対応して実行されているのがわかります。
このように位置引数、*args、**kwargsは全て組み合わせて使うことができます。
注意点としては、*argsと**kwargsの順番を間違えるとエラーになるので順番を間違えないようにしてください。
まとめ
Pythonでは複数の引数を使った関数を定義できます。この複数の引数をまとめて扱う方法があります。
位置引数はタプル化して使うことができます。*argsというキーワードを使うのがPythonでは慣習になっています。
キーワード引数は辞書化して使うことができます。**kwargsというキーワードを使うのがPythonでは慣習になっています。
これらは全てまとめて一つの関数の引数として利用することもできます。*argsと**kwargsの順番は間違えないようにしないとエラーになります。