引数によっては受け取る要素数を固定したくない場合があります。例えばRPGで現在攻撃可能なキャラクターのみ攻撃に参加する場合などです。こういった場合はその引数を可変長引数とすることで複数の値をリストとして受け取ることができます。
引数を可変長引数としたい場合には次のように引数名の前にアスタリスクを付けて記述します。
def 関数名(*引数名): 処理
では実際に複数のキャラクターの攻撃メッセージを表示するコードを記述してみましょう。
def attack(ad, skill, *names): # namesは可変長引数 damage = ad * skill # 与ダメージを算出 for name in names: print(name + "は" + str(damage) + "のダメージを与えた") attack(100,2,"勇者","魔法使い","遊び人") # 引数を指定して実行
第三引数であるnamesは可変長引数となっているため、呼び出し時に指定した勇者、魔法使い、遊び人を要素としたリストとして利用することができます。
実行結果は次のとおりです。
勇者は200のダメージを与えた 魔法使いは200のダメージを与えた 遊び人は200のダメージを与えた
複数人の攻撃メッセージを表示することができました。
namesは可変長引数なので要素数は自由に指定することができます。攻撃キャラクターを2人にしたり、4人にしたりしてみて下さい。
可変長引数はリストだけでなく、辞書を使用することもできます。辞書として使用するには次のように引数名の前にアスタリスクを2つ付けて記述します。
def 関数名(**引数名): # 関数定義 処理 関数名(キー1 = 値, キー2 = 値, キー3 = 値) # 関数呼び出し
実際のコード例を見てみましょう。
次のコードはRPGの主人公パーティーの職業をキー、与ダメージを値とした辞書を関数の引数として指定しています。
def attack(**attacks): # namesは可変長引数 for name,damage in attacks.items(): print(name + "は" + str(damage) + "のダメージを与えた") attack(hero = 100, wizard = 150, playman = 10) # 関数呼び出し
実行結果は次のとおりです。
heroは100のダメージを与えた wizardは150のダメージを与えた playmanは10のダメージを与えた
for文とitemsメソッドを使ってキーと値を順番に取り出し、文字列と連結して表示させています。
ちなみに辞書の中身は引数として与えた順序になるとは限らないので気を付けて下さい。