【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
関数はname
、age
、from_city
という3つの仮引数をこの順番で受け取るように定義されています。
そして、introduce("鈴木 一郎", 25, "大阪")
と呼び出すと、
- 1番目の
"鈴木 一郎"
がname
に - 2番目の
25
がage
に - 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=True
やsend_welcome_email=False
と書かれていることで、True
やFalse
が「管理者権限」や「ウェルカムメールの送信」に関する設定であることが一目瞭然です。
一方、上の位置引数だけのコードでは、True
やFalse
が何を意味するのか、関数の定義を見に行かないと分かりません。キーワード引数は、コードを読む人への親切な「注釈」の役割も果たしてくれるのです。
メリット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)として受け取ってくれます。これにより、非常に柔軟で拡張性の高い関数を作ることができます。
これはまるで、どんなものでも入れられる魔法のバッグのようなものです。name
やage
といったラベルを貼った荷物をバッグに放り込むと、関数の中ではそのバッグを開けて、何が入っているかを一つ一つ確認できる、というイメージですね。
今後の学習のために
キーワード引数の便利さ、伝わりましたでしょうか?
- 可読性があがる
- 引数の順番を気にしなくていい
- デフォルト値と相性がいい
これらのメリットを考えれば、使わない手はありません。特に、引数が3つ以上ある関数や、True/False
のような意味が分かりにくい値を渡す関数では、積極的にキーワード引数を使ってみてください。それだけで、あなたのコードは格段に読みやすく、そして間違いにくくなります。
今回、キーワード引数の素晴らしさを知ったあなたは、もう初心者から一歩抜け出したも同然です。
次は、
*args
(任意の位置引数)と**kwargs
を組み合わせた関数の作り方- 関数に渡された引数を、そのまま別の関数に引き渡すテクニック
などを学んでみると、さらに理解が深まるでしょう。PythonのWebフレームワークなどでは頻繁に使われるテクニックなので、知っておくと必ず役立ちます。
まずは、今日学んだキーワード引数を、あなたのコードに早速取り入れてみてください。きっと、その効果を実感できるはずです!
セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク
投稿者プロフィール
- 代表取締役
-
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。