【Python】レッスンF-1:可変長引数を理解しよう

ながみえ
【Python学習記事のアイキャッチ画像】LessonF-1 可変長引数を理解しよう

Flaskの学習に入る前にもう少しだけPythonの学習をしましょう。

今回は可変長引数について見ていきます。

Lesson1:基礎文法編
Lesson2:制御構造編
Lesson3:関数とスコープ編
Lesson4:データ構造編
Lesson5:オブジェクト指向編
Lesson F:補足学習編
・Lesson F-2:可変長引数を理解しよう ◁今回はココ
・Lesson F-2:デコレーターを理解しよう
Python基礎習得者にお勧めの道5選(実務or副業)

Pythonの記事一覧

Python学習カテゴリの親ページ用アイキャッチ画像(テキスト&問題集)、記事一覧へのリンク案内

Flaskの記事一覧

次のページ>>

可変長引数の基礎|*args/**kwargsの考え方と使い分け

*args**kwargsは、関数が可変個の引数(位置・キーワード)を受け取れるようにする仕組みです。

本記事では概要と基本ルール、よくある使い方を実例で整理します。

この知識があれば、引数の増減に強い関数設計やラッパー/デコレータでの引数の受け渡し、既存データのアンパック渡しなどがスムーズに行え、再利用性の高いAPIを組み立てられるようになります。

それでは、短いルールと実例から “柔軟な引数” の感覚をつかんでいきましょう。

【Python】勉強猫がノートパソコンを前にして学習を始める様子。記事内の学習スタート用イラスト

可変長引数の概要|*args**kwargsで受け取りを柔軟に

可変長引数とは、関数に渡す引数の数を制限せず、好きなだけ渡せる仕組みのことです。

通常の引数は呼び出すたびにすべての値を明示的に指定する必要がありますが、可変長引数を使うと、「0個〜複数個」の引数を渡せるようになります。

Pythonでは次の2種類の可変長引数があります:

  • *args:位置引数(通常の変数)を可変で受け取る
  • **kwargs:キーワード引数を可変で受け取る

argsやkwargsの部分は任意に決めることができます。

アスタリスクの数に意味があり、「*」はまとめてタプルに、「**」はまとめて辞書に変換されます。

タプルや辞書について復習する場合は↓↓の記事を参考にしてください。

あわせて読みたい
【Python】レッスン4-09:タプルの基本を理解しよう
【Python】レッスン4-09:タプルの基本を理解しよう
あわせて読みたい
【Python】レッスン4-11:辞書の基本を理解しよう
【Python】レッスン4-11:辞書の基本を理解しよう

可変長引数の基本構文と基本構文と並び順整理

以下が、可変長引数を使った関数定義の基本形です:

def 関数名(*変数名):	# 可変長(数を自在に決めれる)の位置引数を持つ関数を定義
    # 処理

def 関数名(**変数名):	# 可変長のキーワード引数を持つ関数を定義
    # 処理
  • *変数名 は複数の位置引数を1つのタプルとして受け取ります。
  • **変数名 は複数のキーワード引数を1つの辞書として受け取ります。

また、通常の引数と併用することもできます:

def greet(greeting, *names): # 1つ目の引数はgreeting。2つめ以降は可変長の引数names
    for name in names:
        print(f"{greeting}, {name}!")
        
greet("Hello", "Alice", "Bob") # greetingにHelloを渡し、可変長引数namesに2つの名前を渡す
							   # 2つの名前はタプルに変換され、greet関数はそれぞれに対して実行される

このコードを実行すると、以下のように出力されます。

Hello, Alice!
Hello, Bob!

なお、Pythonで引数を定義する際は、以下の順序を守る必要があります:

  1. 通常の位置引数
  2. *args
  3. デフォルト付きのキーワード引数
  4. **kwargs
def funk(pos1, pos2,  *args, kwd1, kwd2, **kwargs)

可変長引数*args**kwargsの使用例とその解説

いくつかの使用例を以下に紹介します。

例1:*args の使用

def add_numbers(*args):
    return sum(args)

print(add_numbers(1, 2, 3))	# 6
print(add_numbers(10))		# 10
print(add_numbers())		# 0

この関数は、渡されたすべての数値を合計します。

args はタプルとして受け取られます。

例2:**kwargs の使用

def print_info(**kwargs):
    for key, value in kwargs.items():
        print(f"{key}: {value}")

print_info(name="Taro", age=20)
# name: Taro
# age: 20

この関数は任意のキーワード引数を受け取り、キーと値を表示します。

例3:引数の混在

def profile(title, *args, **kwargs):
    print(f"== {title} ==")
    print("Names:", args)
    print("Details:", kwargs)

profile("User Info", "Alice", "Bob", age=25, city="Tokyo")
# == User Info ==
# Names: ('Alice', 'Bob')
# Details: {'age': 25, 'city': 'Tokyo'}

この例ではtitle が通常引数、args が名前のリスト、kwargs が詳細情報となっています。

まとめ|*args/kwargsで “引数を束ねて渡す” 自由度

ここまでで可変長引数の役割と使い方、そして基本構文と並び順のルール、さらに実例での活用パターンを確認しました。

これにより、引数の数や名前が変化しても壊れにくい関数設計ができ、余分な引数を受け取って処理を委譲(フォワード)したり、ラッパー関数/デコレータで柔軟に受け取って加工したりといった実装が可能になります。

小さな練習を何度か繰り返し、書き方を手に馴染ませてください。

「引数を束ねて受け取り、必要な先へ渡す」感覚が身につくほど、設計の自由度と保守性は確実に上がっていきます。

Q
サイト改善アンケート|ご意見をお聞かせください(1分で終わります)

本サイトでは、みなさまの学習をよりサポートできるサービスを目指しております。
そのため、みなさまの「プログラミングを学習する理由」などをアンケート形式でお伺いしています。

1分だけ、ご協力いただけますと幸いです。

【Python】サイト改善アンケート
1.このサイトをどのように活用していますか?また、今後どのように活用したいですか?
5.気になっているサービス・商品があれば教えてください。
(複数選択可)
※ 特定の記事に関する内容の場合は、記事番号(Python Lesson〇-〇)をご記入願います。 また、ご質問はここではなく問い合わせフォームからお願いします。

練習問題:可変長引数を使ってみよう

この記事で学習した「可変長引数」を復習する練習問題に挑戦しましょう。

【Python】勉強猫がノートパソコンに向かい、練習問題に挑戦する様子。記事内の休憩用イラスト

問題|買い物リストと合計金額を表示しよう

買い物リストの品目と、商品価格の合計を表示するプログラムを作成しましょう。

品目の名前や価格の数は毎回変わる可能性があります。

そこで、可変長引数を使って関数に複数の値を柔軟に渡せるようにすることが今回の学習目標です。

以下の要件に従ってコードを完成させてください。

  1. 品目の表示
    関数 show_shopping_list(*items) を定義し、可変個の文字列(品目名)を受け取り、見出し行のあとに各品目を1行ずつ表示すること。
  2. 合計金額の計算
    関数 calculate_total_price(*prices) を定義し、可変個の整数(価格)を受け取り、合計値を戻り値として返すこと。
  3. 利用例の実行
    show_shopping_list("たまご", "パン", "牛乳") を呼び出してリストを表示し、total = calculate_total_price(120, 350, 220) の戻り値を total に代入して、合計金額をメッセージ付きで出力すること。

ただし、以下のような実行結果となるコードを書くこと。

買い物リストを表示します:
- たまご
- パン
- 牛乳
合計金額は 690 円です。

ヒント|難しいと感じる人だけ見よう

1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。

Q
ヒント1【コードの構成を見る】

正解のコードは上から順に以下のような構成となっています。

1:可変長引数で受け取った品目を見出し付きで順番に表示する
 ・可変長引数は「任意個の位置引数」を一つのまとまりとして受け取る。
 ・受け取ったまとまりは繰り返し処理で1件ずつ取り出して使う。
 ・出力は一定の書式(先頭に記号やスペースを付ける等)で整えると見やすい。

2:可変長引数で受け取った価格を累積し、合計値を戻り値として返す
 ・可変長引数で「任意個の数値」を受け取る(位置引数)。
 ・合計は初期値→繰り返し→加算の順で累積する。
 ・関数は結果を返すのが役割(ここでは表示は行わない)。

3:関数を呼び出して買い物リストを表示し、合計金額を受け取ってメッセージ付きで出力
 ・関数呼び出しでは、品目名や価格をカンマ区切りで並べて可変個の引数として渡す。
 ・合計は戻り値を変数に代入してから使う。
 ・表示は実行結果例の文言と並びに合わせて出力する。

Q
ヒント2【穴埋め問題にする】

以下のコードをコピーし、コメントに従ってコードを完成させて下さい。

# 可変長引数 *items を使って、いくつでも値を受け取れるようにする
def show_shopping_list('''(穴埋め)'''):
    # items には渡されたすべての値がまとまって入ってくる
    print("買い物リストを表示します:")
    '''(穴埋め)
    受け取った items を1つずつ取り出し、"- " + item の形式で1行ずつ表示する for ループを書く
    '''

# 複数の価格(整数)を受け取り、合計を計算する関数
def calculate_total_price('''(穴埋め)'''):
    # prices も可変長引数として受け取り、合計を出す
    total = 0
    '''(穴埋め)
    prices を順に走査して total に足し込む for ループを書く
    '''
    return total

# 実行例①:文字列を複数渡して表示する
show_shopping_list("たまご", "パン", "牛乳")

# 実行例②:価格を複数渡して合計を計算する
total = calculate_total_price(120, 350, 220)
print("合計金額は", total, "円です。")

このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。

解答例|買い物リストと合計計算プログラム

例えば以下のようなプログラムが考えられます。

Q
正解コード
# 可変長引数 *items を使って、いくつでも値を受け取れるようにする
def show_shopping_list(*items):
    # items には渡されたすべての値がまとまって入ってくる
    print("買い物リストを表示します:")
    for item in items:
        print("- " + item)

# 複数の価格(整数)を受け取り、合計を計算する関数
def calculate_total_price(*prices):
    # prices も可変長引数として受け取り、合計を出す
    total = 0
    for price in prices:
        total += price
    return total

# 実行例①:文字列を複数渡して表示する
show_shopping_list("たまご", "パン", "牛乳")

# 実行例②:価格を複数渡して合計を計算する
total = calculate_total_price(120, 350, 220)
print("合計金額は", total, "円です。")

解答例の解説|買い物リストと合計計算プログラムの考え方

解答例の詳細解説は以下の通りです。

Q
詳細解説

買い物リストの表示関数

# 可変長引数 *items を使って、いくつでも値を受け取れるようにする
def show_shopping_list(*items):
    # items には渡されたすべての値がまとまって入ってくる
    print("買い物リストを表示します:")
    for item in items:
        print("- " + item)

ここでは品目名の数が毎回変わっても対応できるように、可変長引数を使って複数の文字列をまとめて受け取ります。
受け取った値は、関数の中では一つのまとまりとして扱えるため、繰り返し処理で先頭から順に取り出して表示できます。
最初に案内のメッセージを出してから、各品目を同じフォーマットで整えて並べることで、読みやすいリストを作る流れになっています。

価格の表示関数

# 複数の価格(整数)を受け取り、合計を計算する関数
def calculate_total_price(*prices):
    # prices も可変長引数として受け取り、合計を出す
    total = 0
    for price in prices:
        total += price
    return total

ここでは、価格の数が変わっても対応できるように、任意個の数値をひとまとめで受け取ります。
受け取った値は順番に取り出して合計に足し込み、最後に計算結果だけを返します。
関数の役割を「計算」に限定し、表示は呼び出し側に任せることで、処理の分担が明確になり再利用しやすくなります。
合計の初期値を用意してから繰り返しで更新していく、という基本的な流れを押さえましょう。

買い物リストを表示

# 実行例①:文字列を複数渡して表示する
show_shopping_list("たまご", "パン", "牛乳")

# 実行例②:価格を複数渡して合計を計算する
total = calculate_total_price(120, 350, 220)
print("合計金額は", total, "円です。")

ここでは、これまでに用意した関数を実際に呼び出して動作を確かめます。
まず品目名を複数まとめて渡し、見出しのあとに整ったリストとして表示します。
次に価格を複数渡して合計を計算し、その戻り値を変数に受け取り、説明文と一緒に画面へ出力します。
「計算は関数の中で行い、表示は呼び出し側で行う」という役割分担を意識すると、コードの見通しが良くなり再利用もしやすくなります。
出力の文言や表示形式は、提示された実行結果例に合わせれば十分です。

もっと分かりやすい学習サイトにするために

この記事を読んで「ここが分かりにくかった」「ここが難しかった」等の意見を募集しています。

世界一わかりやすいPython学習サイトにするため、ぜひ 問い合わせフォーム からご意見下さい。

Pythonの記事一覧

Python学習カテゴリの親ページ用アイキャッチ画像(テキスト&問題集)、記事一覧へのリンク案内

Flaskの記事一覧

次のページ>>

可変長引数の疑問解消|FAQと用語のまとめ

初心者がつまずきやすいポイントをFAQとしてまとめ、またよく使う専門用語をわかりやすく整理しました。

理解を深めたいときや、ふと疑問に感じたときに役立ててください。

FAQ|可変長引数に関するよくある質問

Q
Q1. Pythonの可変長引数はどんな場面で使うと便利ですか?

可変長引数は、関数に渡す引数の数が毎回異なるような場面で便利です。例えば、買い物リストやログ出力など、ユーザーの入力数が不定な処理に最適です。コードの柔軟性が増し、汎用的な関数を作成できます。

Q
Q2. *argsと**kwargsは同時に使うことができますか?

はい、argsと*kwargsは同じ関数内で同時に使うことが可能です。ただし、順番には注意が必要で、定義時は「通常の引数 → *args → キーワード引数 → **kwargs」の順で記述します。このルールを守ることでエラーを防げます。

Q
Q3. 可変長引数を使うと処理が遅くなることはありますか?

基本的にはほとんどのケースでパフォーマンスに大きな影響はありません。ただし、大量のデータを渡す処理や頻繁に呼び出される関数では、引数の取り扱い方次第で微小な差が出ることがあります。適切な使い方を心がけましょう。

Python用語集|可変長引数に関する用語一覧

今回の記事で出てきた用語・関数などを一覧で紹介します。

このサイトに出てくる 全てのPython用語をまとめた用語集 も活用してください。

Python用語定義・使い方の概要解説記事へのリンク
引数関数に渡す値。関数定義時には仮引数、呼び出し時には実引数として使われるLesson3-1
可変長引数引数の数が不定な場合に使用する構文。*args**kwargs を使って複数の値を受け取れる本記事
*args位置引数の可変長リストを受け取るための記法。関数に複数の位置引数を渡したいときに使う本記事
**kwargsキーワード引数の可変長辞書を受け取るための記法。引数名と値のペアをまとめて受け取れる本記事
位置引数関数呼び出し時に、引数の順序によって渡される通常の引数なし
記事URLをコピーしました