Pythonの引数の使い方!デフォルト引数・可変長引数・キーワード引数の違い
生徒
「Pythonで関数に値を渡すときって、いろいろな書き方があるみたいですが、よくわからなくて……」
先生
「いいですね、関数の引数はPythonの基本の中でもとても大切なところです。デフォルト引数・可変長引数・キーワード引数など、いろんな書き方がありますよ。」
生徒
「それぞれどう違うんですか? 使い分けも教えてほしいです!」
先生
「もちろんです!順番に分かりやすく説明していきましょう。」
1. Pythonの関数と引数とは?基礎から仕組みを解説
Pythonプログラミングにおいて、関数(function)は「特定の処理をまとめた再利用可能な部品」のようなものです。料理に例えると、関数は「自動調理器」で、そこに投入する材料が「引数(ひきすう)」にあたります。
引数を使うことで、同じ計算や表示処理であっても、渡すデータによって結果を柔軟に変えることができます。これにより、コードを何度も書き直す手間が省け、ミスも減らすことができるのです。
まずは、最もシンプルな「名前を受け取って挨拶を表示する関数」を例に、引数の動きを見てみましょう。プログラミングが初めての方でも、以下のコードで「何がどこに渡されているか」に注目すると理解が深まります。
# greetという名前の関数を定義(nameが引数を受け取る窓口)
def greet(name):
print("こんにちは、" + name + "さん!")
# 関数を呼び出す("たろう"というデータを引数として渡す)
greet("たろう")
# 別のデータを渡せば、表示結果も変わる
greet("さくら")
こんにちは、たろうさん!
こんにちは、さくらさん!
このプログラムでは、greet("たろう")と実行した瞬間に、"たろう"という文字が関数側の変数nameに代入されます。このように、外部から値を受け取る仕組み(引数)をマスターすることが、Pythonを使いこなすための第一歩となります。
2. デフォルト引数:引数にあらかじめ値を設定する
デフォルト引数とは、関数の引数に「最初から決められた値(初期値)」を設定しておく方法です。引数を省略した場合でも、設定された値が使われるので便利です。
def greet(name="ゲスト"):
print("こんにちは、" + name + "さん!")
greet()
greet("さくら")
こんにちは、ゲストさん!
こんにちは、さくらさん!
このように、引数を渡さなかった場合は「ゲスト」が使われ、渡した場合はその値が優先されます。
3. 可変長引数:引数の数が決まっていない場合に使う
可変長引数(かへんちょうひきすう)は、引数の数が決まっていないときに使う方法です。*(アスタリスク)を使うことで、いくつでも引数を受け取ることができます。
def show_fruits(*fruits):
for fruit in fruits:
print("フルーツ:", fruit)
show_fruits("りんご", "バナナ", "みかん")
フルーツ: りんご
フルーツ: バナナ
フルーツ: みかん
*fruitsは、受け取った複数の値をまとめてタプル(カンマ区切りのデータ)として扱います。
4. キーワード引数:引数名を指定して渡す
キーワード引数は、引数の名前を指定して値を渡す方法です。どの引数に何の値を渡しているかが分かりやすくなります。
def introduce(name, age):
print(name + "さんは" + str(age) + "歳です。")
introduce(name="たろう", age=25)
introduce(age=30, name="はなこ")
たろうさんは25歳です。
はなこさんは30歳です。
このように、引数の順番を気にせずに渡すことができるのも特徴です。
5. キーワード可変長引数:名前付きの引数を自由に受け取る
さらに柔軟に対応したいときには、キーワード可変長引数が便利です。**(アスタリスク2つ)を使うことで、「名前=値」の形式でいくつでも引数を受け取れます。
def show_profile(**info):
for key, value in info.items():
print(key + ":", value)
show_profile(name="たろう", age=22, hobby="ゲーム")
name: たろう
age: 22
hobby: ゲーム
**infoは、受け取った値を辞書(キーと値のペア)として扱います。
6. 引数の順番と組み合わせに注意しよう
Pythonでは、引数を複数組み合わせて使うことができます。ただし、次の順番で定義する必要があります。
- 通常の引数
- デフォルト引数
- 可変長引数(
*args) - キーワード可変長引数(
**kwargs)
def example(a, b=1, *args, **kwargs):
print("a:", a)
print("b:", b)
print("args:", args)
print("kwargs:", kwargs)
example(10, 20, 30, 40, name="たろう", age=25)
a: 10
b: 20
args: (30, 40)
kwargs: {'name': 'たろう', 'age': 25}
このように、引数の型ごとにきちんと順番を守ることで、エラーを避けることができます。
まとめ
Pythonのプログラミングにおいて、関数の引数を使いこなすことは、コードの柔軟性と再利用性を高めるための極めて重要なステップです。今回の記事では、基本的な引数の渡し方から、より高度なテクニックまでを詳しく解説してきました。ここで、これまでに学んだ重要なポイントを改めて整理し、実戦で役立つ知識として定着させましょう。
引数の種類とその役割の再確認
Pythonには、用途に応じて使い分けられる多様な引数の形式が用意されています。これらを適切に選択することで、呼び出し側が使いやすい関数を設計できるようになります。
- 位置引数(通常の引数):最も基本的な形式で、関数定義の順番通りに値を渡します。
- デフォルト引数:関数呼び出し時に値を省略した場合に、あらかじめ設定した初期値が適用されます。これにより、共通の設定をデフォルトにしつつ、必要な時だけカスタマイズするような使い方が可能になります。
- 可変長引数(*args):個数が決まっていない複数の引数を、一つのタプルとしてまとめて受け取ります。集計処理やリストの要素を順次処理する場合に非常に強力です。
- キーワード引数:呼び出し時に「引数名=値」と指定することで、順序に関係なく値を渡せます。コードを読んだ際に「どの値が何を意味しているか」が一目で分かるため、可読性が飛躍的に向上します。
- キーワード可変長引数(**kwargs):任意の数のキーワード付き引数を、辞書形式で受け取ります。設定オプションが多いフレームワークの設計などで多用されます。
実践的なサンプルプログラム:引数の組み合わせ
実際にこれらの引数を組み合わせて使用する場合、どのような動きになるのか、少し複雑なケースを想定したサンプルプログラムを見てみましょう。このコードでは、注文システムをイメージして、商品名、数量、オプション、詳細情報を一度に扱っています。
def create_order(item_name, price, quantity=1, *options, **details):
print(f"商品名: {item_name}")
print(f"単価: {price}円")
print(f"個数: {quantity}")
if options:
print("追加オプション:")
for opt in options:
print(f" - {opt}")
if details:
print("詳細情報:")
for key, value in details.items():
print(f" - {key}: {value}")
total = price * quantity
print(f"合計金額: {total}円")
print("-" * 20)
# さまざまな引数を使って呼び出し
create_order("ノートPC", 120000, 2, "延長保証", "マウス付き", color="シルバー", storage="512GB")
商品名: ノートPC
単価: 120000円
個数: 2
追加オプション:
- 延長保証
- マウス付き
詳細情報:
- color: シルバー
- storage: 512GB
合計金額: 240000円
--------------------
引数設計のコツと注意点
関数を定義する際は、引数の順番に厳格なルールがあります。「位置引数 > デフォルト引数 > 可変長引数 > キーワード可変長引数」の順で記述しなければなりません。この順序を間違えると、Pythonのインタプリタは構文エラー(SyntaxError)を返します。
また、デフォルト引数に「リスト」や「辞書」などの変更可能なオブジェクト(ミュータブルなオブジェクト)を指定する際には注意が必要です。関数の定義時に一度だけ評価されるため、意図しない挙動を招くことがあります。初心者の方は、まず基本である位置引数とデフォルト引数に慣れ、徐々に可変長引数を取り入れていくのが上達の近道です。
Pythonの引数は、柔軟であるがゆえに奥が深い機能です。ライブラリのソースコードなどを読む際にも、これらの引数がどのように使われているかに注目してみると、より深い理解が得られるはずです。
生徒
「先生、ありがとうございました!引数の種類がたくさんあって最初は混乱しましたが、こうやって整理してみると、それぞれにちゃんと役割があるんですね。」
先生
「その通りです。特に*args(アスタリスク一つ)と**kwargs(アスタリスク二つ)の違いは理解できましたか?」
生徒
「はい!*argsは複数の値をバラバラと並べて渡したい時で、**kwargsは名前とセットで辞書みたいに渡したい時、という感じですよね。使い分けるとすごく便利そうです!」
先生
「素晴らしい理解ですね。キーワード引数を使うと、後からコードを見返したときにintroduce(name="たろう", age=25)と書いてあれば、どの数字が年齢なのかが一目で分かります。これは複数人での開発や、未来の自分への優しさにも繋がりますよ。」
生徒
「確かに、ただ数字が並んでいるよりずっと読みやすいです。引数の順番についても、しっかりルールを守って書くように気を付けます!」
先生
「ぜひ、今日学んだことを自分のプログラムでも試してみてください。特にデフォルト引数を活用するだけで、関数の使い勝手がグッと良くなりますから。分からないことがあれば、またいつでも聞いてくださいね。」
生徒
「はい、ありがとうございます!早速いくつか関数を書き換えて、もっとスマートなコードに挑戦してみます!」