1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Python初心者】* と ** は「使う場所」で意味が変わる!定義側と呼び出し側の動きを整理

Posted at

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 定義側 キーワード引数を辞書にまとめる
*リスト 呼び出し側 リストを位置引数に展開する
**辞書 呼び出し側 辞書をキーワード引数に展開する

まとめ

  • *** は「使う場所(定義か呼び出しか)」で意味が変わる
  • 定義側では「まとめる」、呼び出し側では「展開する」
  • 記号の見た目だけで覚えるのではなく、どう使われているかの文脈を意識すると理解しやすくなる

今回は「場所によって意味が変わる」という観点から、アスタリスクの使い方を整理しました。引き続きこうした細かな挙動も丁寧に確認していきたいと思います。

1
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?