Pythonの引数の使い方!デフォルト引数・可変長引数・キーワード引数の違い
生徒
「Pythonの関数で引数っていろいろな種類があるみたいですが、違いがよく分かりません…」
先生
「引数には、デフォルト引数・可変長引数・キーワード引数といった種類があります。それぞれ特徴や使い方が違いますよ。」
生徒
「なんだか難しそうですが、順番に教えてもらえますか?」
先生
「もちろんです。順に例を交えながら説明しますね!」
1. デフォルト引数とは?(引数の初期設定)
Pythonの関数では、あらかじめ引数に特定の値をセットしておくことができます。これを「デフォルト引数」と呼びます。
通常、関数を呼び出すときは引数に値を渡す必要がありますが、デフォルト引数が設定されていれば、値を渡さなかった(省略した)場合に自動的にその初期値が使われます。
例えば、ネットショップの注文画面で「配送希望日」を入力しない場合に、自動的に「最短でお届け」という設定になるようなイメージです。プログラミング未経験の方でも、以下の「あいさつ」の例を見ると仕組みがすぐに分かりますよ。
# nameという引数に、あらかじめ "ゲスト" という値をセットしておきます
def greet(name="ゲスト"):
print(f"こんにちは、{name}さん!")
# 引数を指定せずに呼び出す(省略する)
greet()
# 引数に自分の好きな名前を指定して呼び出す
greet("太郎")
こんにちは、ゲストさん!
こんにちは、太郎さん!
コードの解説をすると、1回目のgreet()では何も渡していないため、初期設定の「ゲスト」が表示されます。2回目のgreet("太郎")では、新しい値が優先されるため「太郎」が表示されます。
この機能を使うことで、「基本的にはこの値でいいけれど、必要な時だけ変更したい」という柔軟なプログラムが簡単に作れるようになります。関数の使い勝手がぐっと良くなる便利なテクニックです。
2. 可変長引数(*args)とは?使い方とメリットを初心者向けに解説
Pythonで関数を作るとき、「渡したいデータの数がその時々で変わる」という場面があります。例えば、買い物リストを表示する関数を作る際、商品が2つの場合もあれば、5つの場合もありますよね。そんな時に便利なのが「可変長引数(かへんちょうひきすう)」です。
関数の引数名の前に*(アスタリスク)を付けるだけで、バラバラに渡された複数の値を、Pythonが自動的に1つの「タプル(ひとまとめの箱)」として受け取ってくれます。これにより、引数の数をあらかじめ決めておく必要がなくなり、コードの柔軟性が格段に上がります。
基本的な書き方とサンプルコード
まずは、複数のフルーツの名前を表示する簡単なプログラムを見てみましょう。引数の数に注目してください。
# 引数名の前に「*」をつけるのがポイント
def show_items(*items):
# itemsの中には、渡されたデータがタプルとしてまとまって入っています
for item in items:
print(f"リストにある商品: {item}")
# 3つのデータを渡す場合
show_items("りんご", "みかん", "バナナ")
# 1つだけ渡す場合でも、エラーにならずに動作します
show_items("メロン")
リストにある商品: りんご
リストにある商品: みかん
リストにある商品: バナナ
リストにある商品: メロン
プログラミング未経験の方にとって、「引数の数を固定しない」という考え方は少し特殊に感じるかもしれません。しかし、この*args(慣習的にargsと書くことが多いです)を使いこなせると、同じ関数を使い回せるシーンが大幅に増え、スッキリとした読みやすいプログラムを書くことができるようになります。
3. キーワード引数(**kwargs)とは?使い道とメリットを初心者向けに解説
Pythonの「キーワード引数(**kwargs)」は、関数の呼び出し時に「引数の名前」と「その値」をセットで渡す仕組みです。最大の特徴は、「いくつ引数を渡すか決まっていないとき」や「データにラベルを付けて整理したいとき」に非常に便利な点です。
引数名の前に**(アスタリスク2つ)を付けて定義すると、渡されたデータは関数の中で「辞書型(dict)」として扱われます。これにより、受け取ったデータを key(名前)と value(中身)のペアで自由に取り出すことが可能になります。
それでは、プログラミング未経験の方でも分かりやすいシンプルな例を見てみましょう。自己紹介の項目が人によって増えたり減ったりする場合を想定しています。
# **infoの部分がキーワード引数です(辞書として受け取ります)
def show_profile(**info):
print(f"受け取ったデータの型: {type(info)}") # 辞書型であることを確認
# 辞書の中身を1つずつ取り出して表示
for key, value in info.items():
print(f"{key}: {value}")
# 呼び出し方は「名前=値」の形式。項目数は自由に変えられます。
print("--- 1人目のデータ ---")
show_profile(name="太郎", age=20, city="東京")
print("\n--- 2人目のデータ(趣味を追加) ---")
show_profile(name="花子", hobby="読書", blood_type="A")
--- 1人目のデータ ---
受け取ったデータの型: <class 'dict'>
name: 太郎
age: 20
city: 東京
--- 2人目のデータ(趣味を追加) ---
受け取ったデータの型: <class 'dict'>
name: 花子
hobby: 読書
blood_type: A
このように、**kwargs(慣習的にinfoやkwargsと書きます)を使うことで、関数側で「どんな項目が来るか」をあらかじめすべて予測して定義しておく必要がなくなります。データの追加や変更に強い、柔軟なプログラムを書くための必須テクニックです。
4. 引数の組み合わせ:複数の引数を使いこなすコツ
Pythonでは、これまで学んだ「デフォルト引数」「可変長引数(*args)」「キーワード引数(**kwargs)」を1つの関数の中で組み合わせて使うことができます。これにより、どのようなデータが来ても柔軟に対応できる「万能な関数」を作ることが可能です。
ただし、自由に並べて良いわけではありません。Pythonには「引数を並べる順番」に厳格なルールがあります。この順番を間違えるとエラーの原因になるため、以下の型をセットで覚えておきましょう。
- 通常の引数(必須の項目)
- デフォルト引数(初期値がある項目)
- 可変長引数(
*args:まとまった複数のデータ) - キーワード引数(
**kwargs:名前付きのオプション設定)
具体的な活用例:カフェの注文システム
例えば、カフェの注文を受ける関数を考えてみましょう。「商品名」は必須ですが、「トッピング」や「細かいカスタマイズ」は人によって異なります。これらを組み合わせると、以下のようにスッキリとしたコードになります。
def make_order(item, quantity=1, *toppings, **details):
print(f"【注文内容】 {item} を {quantity} つ承りました。")
# トッピング(可変長引数)がある場合
if toppings:
print(f" 追加トッピング: {toppings}")
# 詳細設定(キーワード引数)がある場合
if details:
print(f" カスタマイズ設定: {details}")
# 1. シンプルな注文
make_order("アイスコーヒー")
# 2. トッピングと詳細設定を盛り込んだ注文
make_order("カフェラテ", 2, "キャラメルソース", "チョコチップ", size="L", milk="豆乳")
実行結果は以下のようになります。
【注文内容】 アイスコーヒー を 1 つ承りました。
【注文内容】 カフェラテ を 2 つ承りました。
追加トッピング: ('キャラメルソース', 'チョコチップ')
カスタマイズ設定: {'size': 'L', 'milk': '豆乳'}
このように、引数を組み合わせることで「決まった形式」を保ちつつ、ユーザーの好みに合わせた「自由な入力」を同時に受け付けることができるようになります。一見複雑に見えますが、この「型」を一度マスターしてしまえば、Pythonでの関数作りがぐっとプロフェッショナルなものに進化します。
5. 初心者が覚えるべきポイント:関数の柔軟性を高める4つの引数
Pythonの関数を使いこなす上で、引数のバリエーションを理解することは非常に重要です。これらをマスターすると、同じ関数でも状況に応じて異なる挙動をさせることができ、コードの再利用性が格段に上がります。ここでは、初心者がまず押さえておくべき4つの基本パターンを、具体例とともに解説します。
① デフォルト引数(初期値を設定する)
あらかじめ「決まった値」を設定しておく方法です。呼び出す側に指定がなければ、この初期値が使われます。
def say_hello(name="ゲスト"):
print(f"こんにちは、{name}さん!")
say_hello() # 「こんにちは、ゲストさん!」と表示
say_hello("田中") # 「こんにちは、田中さん!」と表示
② 可変長引数(*args:複数の値をまとめて受け取る)
引数の数が決まっていない場合に便利です。渡された複数の値を「タプル」としてまとめて処理できます。
def sum_numbers(*args):
return sum(args)
print(sum_numbers(1, 2)) # 3
print(sum_numbers(10, 20, 30)) # 60
③ キーワード引数(**kwargs:名前付きでデータを受け取る)
「名前=値」の形式でデータを渡すと、関数内部で「辞書型」として扱えます。設定項目が多い関数などで重宝します。
def introduce(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
introduce(名前="佐藤", 年齢=25) # 名前: 佐藤 / 年齢: 25 と表示
④ 引数を並べる順番のルール
これらを組み合わせて使う場合、記述する順番には厳格なルールがあります。この順番を間違えるとエラーになるため、セットで覚えておきましょう。
1. 通常の引数 → 2. デフォルト引数 → 3. *args → 4. **kwargs
まずはシンプルな「デフォルト引数」から使い始め、徐々に「可変長引数」を取り入れていくと、複雑なプログラムもスッキリと書けるようになります。まずは手を動かして、サンプルの値を変えて試してみてください。