Pythonでは *
(アスタリスク)や **
(ダブルアスタリスク)を使ったコードがよく登場しますが、関数の定義側と呼び出し側でまったく意味が違うため、混乱することがありました。
今回の記事では、「場所(使っている位置)によって意味が変わる」という視点から、*
と **
の役割を整理します。
* と ** の意味は「場所」で変わる
使う場所 |
* の意味 |
** の意味 |
---|---|---|
関数の定義側 | 位置引数をタプルにまとめる | キーワード引数を辞書にまとめる |
関数の呼び出し側 | リストなどを展開する | 辞書を展開する |
同じ記号でも、使う「場所(文脈)」によって真逆の動きをするのがポイントです。
関数の定義側:引数を「まとめる」
*args の例
def func(*args):
print(args)
func(1, 2, 3)
(1, 2, 3)
**kwargs の例
def func(**kwargs):
print(kwargs)
func(a=10, b=20)
{'a': 10, 'b': 20}
関数の呼び出し側:引数を「展開」する
*リスト を使って位置引数に展開
def func(x, y, z):
print(x, y, z)
lst = [1, 2, 3]
func(*lst)
1 2 3
**辞書 を使ってキーワード引数に展開
def func(a, b):
print(a, b)
d = {'a': 100, 'b': 200}
func(**d)
100 200
両方使うパターン
def func(*args, **kwargs):
print('args:', args)
print('kwargs:', kwargs)
func(1, 2, x=10, y=20)
args: (1, 2)
kwargs: {'x': 10, 'y': 20}
おさらい:まとめ表
書き方 | 場所 | 意味 |
---|---|---|
*args |
定義側 | 位置引数をタプルにまとめる |
**kwargs |
定義側 | キーワード引数を辞書にまとめる |
*リスト |
呼び出し側 | リストを位置引数に展開する |
**辞書 |
呼び出し側 | 辞書をキーワード引数に展開する |
まとめ
-
*
や**
は「使う場所(定義か呼び出しか)」で意味が変わる - 定義側では「まとめる」、呼び出し側では「展開する」
- 記号の見た目だけで覚えるのではなく、どう使われているかの文脈を意識すると理解しやすくなる
今回は「場所によって意味が変わる」という観点から、アスタリスクの使い方を整理しました。引き続きこうした細かな挙動も丁寧に確認していきたいと思います。