Pythonの関数では、引数の数を事前に決めずに受け取る方法があります。それが「可変長引数」です。
この記事では、以下の内容を初心者向けに解説します。
可変長引数とは?
可変長引数とは引数の数をあらかじめ決めずに、引数を受け取る事ができる機能になります。引数の数が不定の場合に柔軟に対応できるのが最大のメリットになります。
*args
: 引数を タプル で受け取る(位置引数)**kwargs
: 引数を 辞書 で受け取る(キーワード引数)
便利である反面、以下のような注意点もあります。
- 型情報の損失
可変長引数を使用すると、引数の個数や型が明示的に指定されなくなるため、静的な型チェックが効かなくなります。そのため、実行時にエラーが発生する可能性があります。 - メモリ使用量の増加
可変長引数を使用すると、引数の数が多い場合には多くのメモリを消費することになります。特に、大量のデータを扱う場合には、メモリ使用量が問題になることがあります。 - 引数の取り扱いが複雑になる
可変長引数を使用すると、関数内で引数を処理するために多くの制御フローが必要になることがあります。これにより、関数の可読性が低下する可能性があります。
*args の使い方(位置引数)
def greet(*names):
for name in names:
print(f"こんにちは、{name}さん!")
greet("太郎", "花子", "健一")
変数名の前に「*(アスタリスク)」を付けることで可変長引数となります。
実行結果
こんにちは、太郎さん!
こんにちは、花子さん!
こんにちは、健一さん!
通常の引数と *args の組み合わせ
少しややこしいですが、以下のような事も可能です。
def show_scores(subject, *scores):
print("教科:", subject)
print("点数:", scores)
show_scores("数学", 70, 80, 90)
実行結果
教科: 数学
点数: (70, 80, 90)
**kwargs の使い方(キーワード引数)
キーワード引数を受け取る機能もあります。
def func(**kwargs):
print(kwargs)
func(a=1, b=2, c=3)
func(name="Hoge", age=30)
変数名の前に「**(ダブルアスタリスク)」を付けることでキーワード引数を渡す事ができます。
実行結果
{"a": 1, "b": 2, "c": 3}
{'name': 'Hoge', 'age': 30}
可変長引数を用いた使用例
#可変長引数を用いた使用例
def test(*test):
sum = 0
for i in test:
sum += i
return sum
print(test(55,67,80,90))
print(test(43,53,62,77,99))
上記のプログラムは任意の引数の値を合計するものです。引数の長さが変わったものでも「*」を用いることで関数として動くことが確認できます。
実行結果
#292
#334
可変長引数の注意点
注意点 | 内容 |
---|---|
型チェックが難しい | 実行時エラーになる可能性があるため注意 |
可読性の低下 | 引数が多いと処理が複雑に見える |
メモリ使用量 | 大量の引数を扱うときは注意が必要 |
まとめ
項目 | 内容 |
---|---|
*args | 複数の位置引数をまとめて受け取る |
**kwargs | 複数のキーワード引数をまとめて受け取る |
組み合わせ | 通常の引数+*args or **kwargs で柔軟な関数が作れる |
注意点 | 多用しすぎると可読性や保守性が下がる |