【Python】アスタリスク(*)を制する者はPythonを制す!変幻自在な記号の役割

こんにちは。ゆうせいです。

プログラミングを始めた誰もが、*(アスタリスク)記号を「掛け算」の記号として学びますよね。もちろんそれは正解です。ですが、Pythonの世界において、アスタリスクはそれだけにとどまらない、驚くほど多彩な顔を持つスーパーシンボルなのです!

関数の定義や呼び出し、リストの分解など、様々な場面で登場しては、魔法のような働きをします。

今回は、この変幻自在なアスタリスク(*)と、その相棒であるダブルアスタリスク(**)の役割を解き明かしていきましょう。これを理解すれば、あなたのPythonスキルは間違いなく一段階レベルアップしますよ!

役割1: 基本の「き」 - 数値計算の演算子

まずは、一番おなじみの役割から確認しましょう。これはウォーミングアップです!

  • * (アスタリスク1つ): 掛け算
  • ** (アスタリスク2つ): べき乗(累乗)
# 掛け算
result_multi = 5 * 4
print(f"5 × 4 = {result_multi}") # 5 × 4 = 20

# べき乗
result_power = 2 ** 3
print(f"2の3乗 = {result_power}") # 2の3乗 = 8

ここまでは大丈夫ですね? では、いよいよアスタリスクの真の力を見ていきましょう!

役割2: 「アンパック」- 魔法の箱開け

アスタリスクの最も強力な機能の一つが「アンパック(unpacking)」です。これは、リストや辞書といったコレクション(データの集まり)を、まるで箱から中身を取り出すように分解し、個々の要素として展開する機能です。

*: リストやタプルを分解する

こんな状況を考えてみてください。ある関数が3つの引数を必要としているとします。

def sum_three_numbers(a, b, c):
    return a + b + c

そして、あなたの手元には [10, 20, 30] というリストがあります。このリストの要素を、関数に渡すにはどうすれば良いでしょうか?

sum_three_numbers(numbers[0], numbers[1], numbers[2]) と書くのは、少し面倒ですよね。ここでアスタリスクの出番です!

numbers = [10, 20, 30]

# アスタリスクを付けてリストを渡す!
total = sum_three_numbers(*numbers)

print(total) # 60

*numbers と書くだけで、Pythonは sum_three_numbers(10, 20, 30) と書かれたかのように、リストの中身を展開して渡してくれるのです。まるで、お弁当箱(リスト)の蓋をパカっと開けて(*)、中のおかずを一つずつテーブル(引数)に並べてくれるイメージです。

**: 辞書をキーワード引数として分解する

ダブルアスタリスク ** は、辞書に対して同じような働きをします。こちらは、辞書のキーを引数名(キーワード引数)として展開します。

def introduce(name, age, city):
    print(f"私は{name}です。{age}歳で、{city}に住んでいます。")

user_data = {
    "name": "ゆうせい",
    "age": 25,
    "city": "東京"
}

# ダブルアスタリスクで辞書を渡す!
introduce(**user_data)

**user_data と書くことで、introduce(name="ゆうせい", age=25, city="東京") と同じ意味になります。データと処理を綺麗に分離できる、非常にエレガントな書き方だと思いませんか?

役割3: 「パック」- 引数を一つにまとめる袋

アンパックとは逆に、複数の引数を一つの変数にまとめる「パック(packing)」という機能もあります。これは主に関数の定義側で使われます。

*args: 複数の引数をタプルにまとめる

「引数がいくつ渡されるか分からない関数」を作りたい、と思ったことはありませんか? 例えば、渡された数字をすべて合計する関数などです。

def sum_all(*args):
    print(f"受け取った引数: {args}")
    total = 0
    for num in args:
        total += num
    return total

print(sum_all(1, 2, 3)) # 受け取った引数: (1, 2, 3) → 6
print(sum_all(10, 20, 30, 40, 50)) # 受け取った引数: (10, 20, 30, 40, 50) → 150

関数定義で *args と書くと、関数に渡された複数の引数が args という名前の「タプル」にまとめられます。まるで、お客さんがレジに持ってきた商品を、店員さんが一つの買い物袋(*args)に詰めてくれるようなイメージですね。ちなみに args という名前は慣習で、*numbers のように別の名前でも構いません。

**kwargs: 複数のキーワード引数を辞書にまとめる

同じように、**kwargs を使うと、複数のキーワード引数を一つの「辞書」にまとめることができます。

def show_options(**kwargs):
    print(f"受け取ったオプション: {kwargs}")
    for key, value in kwargs.items():
        print(f"- {key}: {value}")

show_options(font="Arial", size=12, color="blue")

実行すると、kwargs{ 'font': 'Arial', 'size': 12, 'color': 'blue' } という辞書になっているのが分かります。柔軟な設定が可能な関数を作りたい時に、非常に役立ちます。

その他の便利な使い方

アスタリスクには、他にもモダンなPythonで役立つ機能があります。

分割代入での利用

リストやタプルの要素を分解して変数に入れる時、* を使うと「残りすべて」を一つのリストとして受け取れます。

scores = [100, 85, 90, 78, 92]

# 1位と、それ以外の点数に分ける
first, *others = scores

print(f"1位: {first}")   # 1位: 100
print(f"その他: {others}") # その他: [85, 90, 78, 92]

キーワード専用引数の強制

関数の定義で * だけを独立して置くと、それ以降の引数は必ずキーワード引数として指定しなければならない、というルールを課すことができます。

def create_user(name, *, email, password):
    # ... 処理 ...
    print(f"ユーザー{name}を作成しました。")

# 正しい呼び出し方
create_user("Yusei", email="test@example.com", password="password123")

# 間違った呼び出し方(エラーになる!)
# create_user("Yusei", "test@example.com", "password123")

これにより、引数の順番を間違えるといったケアレスミスを防ぎ、より安全な関数を作ることができます。

まとめ:アスタリスクは柔軟なコードの鍵

アスタリスク(*, **)は、単なる計算記号ではありません。Pythonの柔軟で美しいコードを書くための、非常に重要なシンボルなのです。

特に、関数の引数を扱う *args, **kwargs や、アンパック機能は、多くのライブラリやフレームワークで頻繁に使われています。最初は少し戸惑うかもしれませんが、この仕組みを理解できると、他人の書いたコードが格段に読みやすくなりますし、あなた自身が書くコードの表現力も大きく向上するはずです。

まずは、*args, **kwargs を使って、引数の数が可変な関数を自分で作ってみることから始めてみてください。きっとアスタリスクの便利さと面白さに気づくはずですよ!

セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。