PR

【Python】可変長引数(*argsと**kwargs)の使い方を3分で解説

Python

可変長引数(*args**kwargs)は、関数が不確定な数の引数を取り扱うために用いられる特性です。可変長引数を利用することで、「個別に引数を定義することなく」多数の引数を関数に渡すことができるようになります。

参考 関数の使い方(def文の基本)

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から解説します。複数の引数を自由自在に操作できるようになり、より効率的かつ汎用的な関数を作成できるようになることを目指します。

このページで学べる内容
  • 可変長引数の基本
    • *argsの使い方
    • **kwargsの使い方
  • 可変長引数の特徴と注意点
  • 可変長引数のベストプラクティス

Pythonエンジニアを目指す方であれば知らないと恥ずかしい基本知識の1つです。是非最後までご覧ください。

参考 Pythonの基本的な書き方・構文ルール

スポンサーリンク

可変長引数(*args/**kwargs)の基本

Pythonにおける可変長引数は、予め引数の数が不明な場合でも関数を簡単に定義するためのツールです。これは主に*args**kwargsという2つの形で表現されます。

*args**kwargsという名前は慣習的によく使われるものであって、Pythonでは実際には*args**kwargs以外の名称を使用することができます。*(アスタリスク)を付けることによって可変長引数として動作するというルール。

分かりやすく言うと

関数を定義する際に引数を2つ指定した場合には、関数の実行時に必ず2つの引数を渡さなければいけませんでした。

図1:関数へ渡す引数

ですが、可変長引数を使えれば(引数の先頭に「*」を付与すれば)任意の数のパラメータを渡すことができるようになるということ。

可変長引数,*args,**kwargs
図2:可変長引数(*args**kwargs

まず、*argsを見ていきましょう。

これは「任意の数の位置引数」を関数に渡すための構文です。この*記号がポイントで、これによって引数がタプルとして関数に渡されます。

def func(*args):
    for arg in args:
        print(arg)

func('apple', 'banana', 'cherry')
# 出力結果:
# apple
# banana
# cherry

参考 for文 / print関数

上記の例では、関数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は一緒に使うこともできます。

ただし、*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関数では、まず最初に位置引数abが解釈され、その後の引数は*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)のまとめ

  • *argsは任意の数の位置引数をタプルとして収集
  • **kwargsは任意の数のキーワード引数を辞書として収集
  • *argsは通常の引数よりも後 / **kwargsは全ての他の引数よりも後に位置しなければならない
def func(a, *args, **kwargs):
    print(a)
    print(args)
    print(kwargs)

# 関数を呼び出す
func(1, 2, 3, x=4, y=5)

# 出力結果:
# 1
# (2, 3)
# {'x': 4, 'y': 5}

始めてPythonを勉強するのは結構難しいですよね。

でもその悩みを抱えているのは一人じゃありません。全てのPython使いが同じ道を進んできました。

Pythonをはじめとするプログラミングスキルを武器に、時間と場所に捉われない自由な生き方を目指してみませんか?今すぐ行動したい方は以下の記事をチェック!

読者料典 Python入門:学習カリキュラム ←こちらから!

このWebサイトは現役のエンジニアが以下3点を目的として運営しています。

  1. 勉強:一度理解した内容を忘れないように。
    → アウトプットは「最強のインプット」である! 
  2. 備忘:忘れたとしても後から見返せるように。
    → 未来の自分への「お手紙」を書いています。 
  3. 共有:〇〇ってこうだったんだ!の感動をシェアできるように。
    → あなたの知識は誰かにとっての「価値ある情報」です。 

副業ブログの始め方はこちらから

スポンサーリンク
Python
シェアする
ビズドットオンラインをフォローする
タイトルとURLをコピーしました