可変長引数(*argsや**kwargs)は、関数が不確定な数の引数を取り扱うために用いられる特性です。可変長引数を利用することで、「個別に引数を定義することなく」多数の引数を関数に渡すことができるようになります。
def print_details(name, *args, **kwargs): print("Name: ", name) print("Arguments: ", args) print("Keyword Arguments: ", kwargs) print_details("Alice", "Loves Python", age=25, hobby="coding")
上記のサンプルコードでは、print_details関数が一つの名前(name)と、任意の数の位置引数(*args)とキーワード引数(**kwargs)を受け取っています。これにより、関数呼び出し時にさまざまな引数を指定することが可能になります。
このページでは、Python初心者向けに可変長引数とは何かをわかりやすく1から解説します。複数の引数を自由自在に操作できるようになり、より効率的かつ汎用的な関数を作成できるようになることを目指します。
Pythonエンジニアを目指す方であれば知らないと恥ずかしい基本知識の1つです。是非最後までご覧ください。
可変長引数(*args/**kwargs)の基本
Pythonにおける可変長引数は、予め引数の数が不明な場合でも関数を簡単に定義するためのツールです。これは主に*args
と**kwargs
という2つの形で表現されます。
*args
や**kwargs
という名前は慣習的によく使われるものであって、Pythonでは実際には*args
や**kwargs
以外の名称を使用することができます。*
(アスタリスク)を付けることによって可変長引数として動作するというルール。
関数を定義する際に引数を2つ指定した場合には、関数の実行時に必ず2つの引数を渡さなければいけませんでした。
ですが、可変長引数を使えれば(引数の先頭に「*」を付与すれば)任意の数のパラメータを渡すことができるようになるということ。
まず、*args
を見ていきましょう。
これは「任意の数の位置引数」を関数に渡すための構文です。この*
記号がポイントで、これによって引数がタプルとして関数に渡されます。
def func(*args): for arg in args: print(arg) func('apple', 'banana', 'cherry') # 出力結果: # apple # banana # cherry
上記の例では、関数func
は任意の数の引数を受け取り、それらを一つずつ表示します。
次に**kwargs
です。
これは「任意の数のキーワード引数」を関数に渡すための構文です。この**
記号により、キーワード引数が辞書として関数内に渡されます。
def func(**kwargs): for key, value in kwargs.items(): print(f"{key}: {value}") func(name='Alice', age=25, hobby='coding') # 出力結果: # name: Alice # age: 25 # hobby: coding
この例では、関数func
は任意の数のキーワード引数を受け取り、それらのキーと値を表示します。
*args
と**kwargs
は関数定義時に非常に強力な柔軟性を提供します。しかし、またこれだけではよく理解できない・・・という方も多いはず。次の章でそれぞれの使い方やコツを詳しく解説します。
Python:*args の使い方
*args
は任意の数の位置引数を関数に渡すことを可能にします。位置引数とは、その名の通り、引数が与えられる位置(つまり順序)に依存する引数のことを指します。
以下に、*args
を使った例を示します。
def add_numbers(*args): return sum(args) print(add_numbers(10, 20, 30, 40)) # 出力結果: # 100
このadd_numbers
関数は、引数として与えられたすべての数字を合計します。関数を呼び出す際に何個の引数を渡しても、それら全てがargs
というタプルとして関数内部に渡され、処理が行われます。
*args
は「ある数だけの引数を受け取る」という通常の関数定義を拡張し、任意の数の引数を受け取る柔軟性が特徴。
*args の注意点
重要な注意点として、*args
は必ず普通の引数よりも後に位置しなければならないというルールがあります。
def show_hobbies(name, *hobbies): print(f"{name}'s hobbies are:") for hobby in hobbies: print(hobby) show_hobbies("Alice", "reading", "coding", "running") # 出力結果: # Alice's hobbies are: # reading # coding # running
ここで、name
という普通の引数が先に位置し、その後に*hobbies
が続いています。これにより、関数はまず最初の引数として名前を受け取り、その後に続く任意の数の趣味を受け取ることができます。
このルールを無視した場合、Pythonは引数のどこが普通の引数で、どこからが*args
であるかを判断できなくなり、エラーを出します。
def func(*args, a): print(a) for arg in args: print(arg) # 関数を呼び出す func(1, 2, 3, 4, a=5) # TypeError: func() missing 1 required keyword-only argument: 'a'
これは、Pythonが普通の引数a
と*args
の区別がつかないため。
関数の定義では、*args
が先に来てしまっているため、Pythonはすべての位置引数を*args
に詰め込んでしまい、結果としてa
が与えられずエラーが出ます。
Python:**kwargs
もう一つの可変長引数 **kwargs
の使い方について説明します。
**kwargs
は任意の数のキーワード引数を関数に渡すことを可能にします。キーワード引数とは、名前(キー)と値(バリュー)がペアになっている引数のこと。
def introduce_yourself(**kwargs): for key, value in kwargs.items(): print(f"{key}: {value}") introduce_yourself(name="Alice", age=25, country="USA") # 出力結果: # name: Alice # age: 25 # country: USA
このintroduce_yourself
関数では、引数として与えられたすべてのキーワード引数を表示。
関数を呼び出す際に何個のキーワード引数を渡しても、それら全てがkwargs
という辞書として関数内部に渡され、処理が行われます。
**kwargs の注意点
**kwargs
も*args
と同様に、通常の引数や*args
より後に位置しなければならないというルールがあります。
以下の例では、普通の引数title
と可変長引数**details
を使用しています。
def book_details(title, **details): print(f"Title: {title}") for key, value in details.items(): print(f"{key}: {value}") book_details("Python Guide", author="Alice", year=2025, pages=500) # 出力結果: # Title: Python Guide # author: Alice # year: 2025 # pages: 500
ここで、title
という普通の引数が先に位置し、その後に**details
が続いています。これにより、関数はまず最初の引数として本のタイトルを受け取り、その後に続く任意の数の詳細(キーワード引数)を受け取ることができます。
*argsと**kwargsを一緒に利用する
*args
と**kwargs
は一緒に使うこともできます。
ただし、*args
が**kwargs
よりも前に来なければならないというルールがあります。これは、Pythonが引数をどのように解釈するかというルールに従っています。
Pythonは引数を左から右へと解釈し、最初に位置引数を解釈した後にキーワード引数を解釈します。
def func(a, b, *args, **kwargs): print(a) print(b) for arg in args: print(arg) for key, value in kwargs.items(): print(f"{key}: {value}") # 関数を呼び出す func(1, 2, 3, 4, 5, x=6, y=7, z=8) # 出力結果: # 1 # 2 # 3 # 4 # 5 # x: 6 # y: 7 # z: 8
このfunc
関数では、まず最初に位置引数a
とb
が解釈され、その後の引数は*args
によってタプルとして収集されます。最後に、キーワード引数は**kwargs
によって辞書として収集されます。
このように、*args
と**kwargs
を一緒に使うことで、より柔軟に引数を扱うことが可能。
しかし、これらを使うときは、引数の順序と使い方のルールを守ることが重要です。
可変長引数の注意点
最後に可変長引数のベストプラクティスと注意点を説明します。
*args
と**kwargs
の基本的な使い方を学んできましたが、これらを使う上でのベストプラクティスや注意点を知らないと恥ずかしいコードを書くことになってしまいますので、重要なポイントを以下に整理しました。
可変長引数は意図を明確にする
可変長引数は強力なツールですが常に必要というわけではありません。
必要以上に使用するとコードの可読性を損なう可能性があります。関数がどのような引数を期待しているのかを明確にするためには、具体的な引数を使用することが一般的にはベストです。
def add_numbers(*args): # 不必要に *args を使っている例 return sum(args) # 適切な使用例 def add_numbers(num1, num2): # 明確な引数名を使っている例 return num1 + num2
引数の命名
記事の冒頭でもご説明した通り、*args
や**kwargs
という名前は一般的ですが、これらの名前は必須ではありません。
可能であれば、引数が何を表しているのかをより明確にする名前を選ぶべき。例えば、可変長のキーワード引数が商品の属性を表しているなら、**product_attributes
という名前を選ぶことができます。
def create_product(name, price, **product_attributes): product = {"name": name, "price": price} product.update(product_attributes) return product
これらのベストプラクティスを守ることで、可変長引数を効果的に活用し、コードの可読性と保守性を高めることができます。
可変長引数(*args/**kwargs)のまとめ
始めてPythonを勉強するのは結構難しいですよね。
でもその悩みを抱えているのは一人じゃありません。全てのPython使いが同じ道を進んできました。
Pythonをはじめとするプログラミングスキルを武器に、時間と場所に捉われない自由な生き方を目指してみませんか?今すぐ行動したい方は以下の記事をチェック!
読者料典 Python入門:学習カリキュラム ←こちらから!