Pythonで関数を書いていて「呼び出すたびに引数の数が変わったら便利なのに…」と思った経験はありませんか?実はPythonには、引数の数を固定せず、好きなだけ渡せる可変長引数という仕組みが用意されています✨
これを使いこなせるようになると、関数の汎用性が一気に高まり、コードの重複もぐっと減らせます。さらに、毎日何気なく使っているprint()関数の正体までスッキリ理解できるようになりますよ🎯
可変長引数とは、その名のとおり関数の引数の数が固定ではなく、自由な数だけ設定できる引数のことです。可変長引数を使って関数を定義しておけば、同じ関数を呼び出すときに引数を2つ渡しても、3つ渡しても、はたまた10個渡しても、エラーにならずに動いてくれます。
引数の数を呼び出し側に委ねられる=関数の柔軟性が劇的にアップする、ということ。
書き方は驚くほどシンプルで、関数定義の引数名の前に*を1つ付けるだけ。たったこれだけで、可変長引数の関数が完成します。
*argsdef func(*args):
print(args)
func(1) # → (1,)
func(1, 2, 3) # → (1, 2, 3)
関数側では、受け取った複数の引数が1つのタプルとして変数argsにまとめられます。argsという名前は慣習的によく使われますが、別の名前にしてもまったく問題ありません🙆
joinで文字列結合もできるdef func(*args):
result = ",".join(args)
print(result)
func("a") # → a
func("A", "a", "指") # → A,a,指
こんなふうに、受け取ったタプルをそのままループ系メソッドに渡して使えるのが気持ちいいところ。要素の数に応じて柔軟に処理が走ります。
print()こそ可変長引数の代表選手!「あれ、この動作どこかで見たことあるな…」と感じた方は鋭い👏 そう、毎日のように書いているprint()こそ、可変長引数で作られた関数の代表例です。
print("Hello", "Python", 123)
# → Hello Python 123
引数を何個渡しても半角スペースで区切られて表示されるのは、内部で可変長引数を受け取り、まとめて処理しているからなんですね。仕組みを知ると、いつものコードが少し違って見えてきます🔍
**kwargsもう一つの可変長引数が、キーワード引数を辞書として受け取るタイプ。こちらは引数名の前に*を2つ付けて定義します。
def func(**kwargs):
print(kwargs)
func(name="サイト")
# → {'name': 'サイト'}
func(name="鈴木", id=1, type="02")
# → {'name': '鈴木', 'id': 1, 'type': '02'}
呼び出し側でキー=値の形で渡すと、関数側では引数名がキー、値がバリューの辞書として受け取られます。これも自由な数だけキーワード引数を渡せるので、設定値を柔軟に受け取りたいときに大活躍します✨
可変長引数は、もちろん普通の引数と一緒に使うこともできます。ただし並び順と呼び出し方に少しだけルールがあるので押さえておきましょう。
*argsを後ろに書く場合:普通の引数を先に書き、呼び出し側もそのまま位置引数で渡せばOK。*argsを先に書く場合:普通の引数は後ろに来るので、呼び出し側はキーワード引数で指定する必要あり。**kwargsと普通の引数を組み合わせるときは、普通の引数を先に書くのが基本ルール。def func(*args, x):
print(f"args={args}, x={x}")
func(1, 2, 3, x=100)
# → args=(1, 2, 3), x=100
このあたりを意識すると、エラーで詰まることがぐっと減りますよ🙌
動画と合わせて手元に1冊置いておくと、復習や応用がぐっとスムーズになります。レベル別に厳選した書籍を紹介しますね📖
「そもそも関数の引数ってどう書くんだっけ?」というレベルから優しく学び直したい方にぴったり。会話ベースで読み進められるので、可変長引数のような少し抽象的なテーマも腑に落ちやすいです。
変数・関数・引数のルールを一冊で網羅したい方には、定番のスッキリ系がおすすめ。可変長引数の周辺知識(デフォルト引数・キーワード引数)まで地続きで理解できます。
*argsや**kwargsを「いつ・なぜ使うのか」まで踏み込んで学びたい方に。関数設計の考え方やイディオムに触れられ、コードがぐっとPythonらしくなります。
可変長引数を関数デコレーターや関数合成、API設計にどう活かすか。中級者から上級者へとステップアップしたい方には、こちらが最適です。
「動くコード」から「美しいコード」へ。可変長引数の落とし穴や、保守しやすい関数設計のコツが項目別にまとまっており、知識が一気に立体的になります。
*argsと**kwargs、名前は必ずこれにしないとダメ?いいえ、名前は自由です。*itemsでも**optionsでも動きます。ただ、慣習としてargsとkwargsがデファクトなので、特別な理由がなければこの名前を使うと、他の人が読んだときにすぐ意図が伝わります。
*argsはタプル、**kwargsは辞書って覚えればOK?はい、その理解で大丈夫です✅ *argsは順序を持つ複数の値をタプルとして、**kwargsはキー付きの値を辞書として受け取ります。中身の取り出し方も、それぞれタプル・辞書の操作と同じ感覚でOKです。
*argsと**kwargsは同時に使える?使えます!順序はdef func(普通の引数, *args, **kwargs):のように書くのが基本ルール。これを覚えておけば、ほぼあらゆる呼び出し方を受け止められる汎用関数が作れます🛠️
呼び出し側の書き方が変わります。可変長引数ならfunc(1, 2, 3)のように個別に渡せて、関数側でひとまとめにできます。一方、すでにあるリストを展開して渡したいときはfunc(*my_list)のようにアンパックすればOKです。
もちろん可能です。def func(x: int = 0, *args: int, **kwargs: str) -> None:のように型ヒントもしっかり付けられます。型ヒントを併用すると、エディタの補完や静的解析が効くようになり、バグも減らせて一石二鳥です🎉
可変長引数*argsと**kwargsは、Pythonの関数を一段階パワーアップさせてくれる重要な仕組みです。引数の数や名前を呼び出し側に委ねられることで、汎用的で再利用しやすい関数が書けるようになります。
まずは小さなユーティリティ関数で*argsを試してみて、慣れてきたら**kwargsで設定値を受け取る関数にチャレンジ。気づいたときには、あなたのコードが驚くほどスッキリ&柔軟になっているはずです🚀 今日から早速、自分のスクリプトで使ってみましょう!