【Python超入門】キーワード引数とは?使い方とメリットを新人エンジニアに徹底解説!

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

Pythonでのプログラミングにも少しずつ慣れてきた頃でしょうか?関数を自作して、コードをスッキリ整理できるようになると、プログラミングが一段と楽しくなりますよね。

関数を呼び出すとき、()の中に値(引数)を渡すと思いますが、その渡し方にも実は種類があることをご存知でしたか?

def introduce(name, age, city): のように定義された関数があったとします。

この関数を呼び出すとき、introduce("山田", 30, "東京") のように引数を渡しますよね。

でも、もし引数が5個、10個と増えていったらどうでしょう?

「あれ、3番目の引数ってなんだっけ…?」「順番、間違えてないかな…?」

そんな風に不安になったり、関数の定義を何度も見返すことになったりしがちです。

そんな悩みを一発で解決してくれるのが、今回ご紹介する「キーワード引数」なんです!

この記事を読めば、キーワード引数とは何か、なぜ使うべきなのか、そしてどう使えばいいのかがスッキリ分かります。あなたの書くコードが、もっと読みやすく、もっと間違いにくくなる魔法のテクニックを、一緒に学んでいきましょう!

まずは基本から!「位置引数」をおさらい

キーワード引数の話に入る前に、まずは皆さんが普段から何気なく使っている「位置引数」についておさらいしましょう。

位置引数(いちひきすう)とは、その名の通り、引数を渡す「位置」や「順番」によって、どの仮引数に値が渡るかが決まる方式のことです。

例えば、自己紹介をする次のような関数があったとします。

def introduce(name, age, from_city):
  print(f"こんにちは、私の名前は{name}です。")
  print(f"{from_city}から来ました。年齢は{age}歳です。")

# 位置引数を使って関数を呼び出す
introduce("鈴木 一郎", 25, "大阪")

実行結果:

こんにちは、私の名前は鈴木 一郎です。
大阪から来ました。年齢は25歳です。

この例では、introduce関数はnameagefrom_cityという3つの仮引数をこの順番で受け取るように定義されています。

そして、introduce("鈴木 一郎", 25, "大阪")と呼び出すと、

  • 1番目の "鈴木 一郎"name
  • 2番目の 25age
  • 3番目の "大阪"from_city

というように、定義された順番通りに対応付けられて値が渡されます。これが位置引数です。

位置引数の弱点

位置引数はシンプルで直感的ですが、弱点もあります。それは、引数の順番を間違えると、意図しない結果やエラーを引き起こすことです。

もし、うっかり順番を間違えてしまったら…?

# 引数の順番を間違えて呼び出してみる
introduce("東京", 30, "山田 太郎")

実行結果:

こんにちは、私の名前は東京です。
山田 太郎から来ました。年齢は30歳です。

大変なことになりました!名前が「東京」で、出身地が「山田 太郎」という、意味不明な自己紹介になってしまいましたね。

これはまるで、書類の記入欄のラベルを見ずに、上から順番に「名前」「住所」「年齢」を書いてしまうようなものです。正しい順番を知らないと、正しく記入できないのと同じですね。引数が増えれば増えるほど、この「うっかりミス」のリスクは高まっていきます。

救世主!「キーワード引数」の登場

そこで登場するのが「キーワード引数(きーわーどひきすう)」です!

キーワード引数とは、「仮引数名 = 値」という形式で、どの引数にどの値を渡すのかを明示的に指定する方法です。

さきほどのintroduce関数を、今度はキーワード引数を使って呼び出してみましょう。

def introduce(name, age, from_city):
  print(f"こんにちは、私の名前は{name}です。")
  print(f"{from_city}から来ました。年齢は{age}歳です。")

# キーワード引数を使って関数を呼び出す
introduce(name="佐藤 花子", age=28, from_city="福岡")

実行結果:

こんにちは、私の名前は佐藤 花子です。
福岡から来ました。年齢は28歳です。

name="佐藤 花子"のように、引数名を直接指定しているのが分かりますね。

そして、キーワード引数の最大のメリットは、順番を気にする必要がないことです!

# 順番を入れ替えても、全く同じ結果になる!
introduce(from_city="福岡", name="佐藤 花子", age=28)

実行結果:

こんにちは、私の名前は佐藤 花子です。
福岡から来ました。年齢は28歳です。

すごいでしょう!from_cityを最初に書いても、Pythonは「from_cityという名前の引数に"福岡"を渡せばいいんだな」と正しく理解してくれます。

これは、先ほどの書類の例で言えば、各記入欄に「名前:」「住所:」「年齢:」としっかりラベルが書いてあるようなものです。どの欄から書き始めても、ラベルさえ見ていれば間違えようがありませんよね。

この図のように、位置引数は順番が命ですが、キーワード引数は名前で直接結びつくため、順番は自由自在なのです。

キーワード引数を使う3つの大きなメリット

キーワード引数には、順番を気にしなくていい以外にも、たくさんのメリットがあります。特に重要な3つを見ていきましょう。

メリット1: コードの可読性が劇的に向上する!

可読性(かどくせい)、つまりコードの読みやすさが格段に上がります。

例えば、ユーザーを作成する関数があったとします。

# 位置引数だけだと、TrueやFalseが何を示しているか分かりにくい
create_user("tanaka", "p@ssword", True, False)

# キーワード引数を使えば、一目瞭然!
create_user(
  username="tanaka", 
  password="p@ssword", 
  is_admin=True, 
  send_welcome_email=False
)

下のキーワード引数を使ったコードを見てください。is_admin=Truesend_welcome_email=Falseと書かれていることで、TrueFalseが「管理者権限」や「ウェルカムメールの送信」に関する設定であることが一目瞭然です。

一方、上の位置引数だけのコードでは、TrueFalseが何を意味するのか、関数の定義を見に行かないと分かりません。キーワード引数は、コードを読む人への親切な「注釈」の役割も果たしてくれるのです。

メリット2: デフォルト値との相性が抜群!

関数の引数には、あらかじめ初期値を設定しておく「デフォルト値」という機能があります。

def send_email(to_address, subject, body, priority=1):
  """
  メールを送信する関数。priorityは優先度で、1が通常。
  """
  print(f"To: {to_address}")
  print(f"Subject: {subject}")
  print(f"Body: {body}")
  print(f"Priority: {priority}")

# 優先度はデフォルトのままでいいので、指定しない
send_email("test@example.com", "こんにちは", "本文です")

print("-" * 20)

# 優先度を高くしたい場合だけ、キーワード引数で指定する
send_email("urgent@example.com", "【緊急】", "至急ご確認ください", priority=3)

send_email関数のpriority引数には、=1というデフォルト値が設定されています。これにより、priority引数は省略可能になります。

ここでキーワード引数が大活躍します。優先度を変えたいときだけ、priority=3のようにピンポイントで指定できるのです。もし位置引数しか使えないとしたら、たとえデフォルト値があっても、順番を守るためにすべての引数を書かなければならず、非常に不便です。

メリット3: 関数の機能拡張がしやすくなる!

将来、関数の機能を追加したくなったとき、キーワード引数で引数を追加すれば、既存のコードを壊さずに済みます。

例えば、さきほどのsend_email関数に、後から「CC」を追加したくなったとします。

# CC機能を追加した新しい関数
def send_email(to_address, subject, body, priority=1, cc=None):
  # ... (処理は省略) ...

# 以前の呼び出しコードは、何も変更しなくてもそのまま動く!
send_email("test@example.com", "こんにちは", "本文です")

新しい引数ccを、デフォルト値を持つキーワード引数として末尾に追加しました。こうすることで、ccが導入される前に書かれたsend_email(...)という呼び出しコードは、何も変更しなくてもエラーにならずに動き続けます。これは、システムの保守や運用において非常に重要な性質です。

覚えておきたいルールと注意点

キーワード引数はとても便利ですが、いくつか守らなければならないルールがあります。

位置引数は、キーワード引数よりも必ず先に書くこれが最も重要なルールです。

# OK: 位置引数 -> キーワード引数 の順番
introduce("山田 太郎", from_city="東京", age=30)

# NG: キーワード引数の後に位置引数を書くとエラーになる!
# introduce(name="山田 太郎", 30, "東京") 
# --> SyntaxError: positional argument follows keyword argument

同じ引数に複数の値を渡すことはできない位置とキーワードで、同じ引数を二重に指定することはできません。

# NG: name引数を位置引数とキーワード引数の両方で指定している
# introduce("鈴木", name="佐藤", age=25, from_city="大阪")
# --> TypeError: introduce() got multiple values for argument 'name'

この2つのルールさえ押さえておけば、混乱することはないでしょう。

OKな例NGな例なぜNGか
func(1, 2, c=3)func(c=3, 1, 2)キーワード引数の後に位置引数は置けない
func(a=1, b=2, c=3)func(1, a=2, b=3)aに値を2回渡そうとしている
func(1, c=3, b=2)

発展:魔法の引数 **kwargs

最後に少しだけ発展的な内容に触れておきます。関数の定義で **kwargs (キーワード・アーギュメンツの略) という書き方を見たことはありますか?

これは、任意の数のキーワード引数を、辞書としてまとめて受け取るための特殊な構文です。

def display_profile(**user_info):
  print("--- プロフィール ---")
  for key, value in user_info.items():
    print(f"{key}: {value}")
  print("--------------------")

# 自由にキーワード引数を渡してみる
display_profile(name="田中", age=40, city="札幌", hobby="釣り")

display_profile(name="木村", occupation="デザイナー")

実行結果:

--- プロフィール ---
name: 田中
age: 40
city: 札幌
hobby: 釣り
--------------------
--- プロフィール ---
name: 木村
occupation: デザイナー
--------------------

display_profile関数は、どんなキーワード引数が渡されても、user_infoという名前の辞書(dictionary)として受け取ってくれます。これにより、非常に柔軟で拡張性の高い関数を作ることができます。

これはまるで、どんなものでも入れられる魔法のバッグのようなものです。nameageといったラベルを貼った荷物をバッグに放り込むと、関数の中ではそのバッグを開けて、何が入っているかを一つ一つ確認できる、というイメージですね。

今後の学習のために

キーワード引数の便利さ、伝わりましたでしょうか?

  • 可読性があがる
  • 引数の順番を気にしなくていい
  • デフォルト値と相性がいい

これらのメリットを考えれば、使わない手はありません。特に、引数が3つ以上ある関数や、True/Falseのような意味が分かりにくい値を渡す関数では、積極的にキーワード引数を使ってみてください。それだけで、あなたのコードは格段に読みやすく、そして間違いにくくなります。

今回、キーワード引数の素晴らしさを知ったあなたは、もう初心者から一歩抜け出したも同然です。

次は、

  • *args(任意の位置引数)と**kwargsを組み合わせた関数の作り方
  • 関数に渡された引数を、そのまま別の関数に引き渡すテクニック

などを学んでみると、さらに理解が深まるでしょう。PythonのWebフレームワークなどでは頻繁に使われるテクニックなので、知っておくと必ず役立ちます。

まずは、今日学んだキーワード引数を、あなたのコードに早速取り入れてみてください。きっと、その効果を実感できるはずです!

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

投稿者プロフィール

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