キーワード引数
このレッスンで分かること
- キーワード引数は
関数(引数名=値)の形で名前指定して渡す書き方です- 位置引数 → キーワード引数の順序を守らないと
SyntaxErrorになります- 最小例は
def area(width=1, height=1): return width * height(area(width=5, height=3)で15)
キーワード引数 とは
引数を名前で指定するキーワード引数の使い方を学びます。本レッスンでは、キーワード引数 の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。
キーワード引数
関数に引数を渡すとき、Python には 2 つの渡し方があります。位置で渡す 位置引数 (positional argument) と、名前で渡す キーワード引数 (keyword argument) です。前者は順番が命、後者は名前を書くので順番が自由になります。読みやすくて安全なコードを書くには、両方をうまく使い分ける必要があります。
キーワード引数を使うと、呼び出し側のコードが「自己ドキュメント化」されます。引数の意味がコードを読むだけで分かるからです。
文法
キーワード引数は、呼び出し時に 引数名=値 の形式で書きます。
Python
def build_url(host, port, protocol):
return f"{protocol}://{host}:{port}"
url = build_url(host="example.com", port=8080, protocol="https")
print(url)このコードでは host port protocol を名前で指定しています。順番を入れ替えても結果は同じです。
Python
url = build_url(protocol="https", port=8080, host="example.com")位置引数と違い、引数名=値 のペアを直接書くので、port=8080 を host の位置に書いてしまうような事故が防げます。
位置引数とキーワード引数の混在
両者を混ぜて使うこともできます。ただし、位置引数を先に、キーワード引数を後に書くというルールがあります。
Python
build_url("example.com", port=8080, protocol="https")逆順 (build_url(host="example.com", 8080, "https")) は SyntaxError です。
| 呼び出し方 | 例 | 結果 |
|---|---|---|
| 位置だけ | build_url("example.com", 8080, "https") | OK |
| キーワードだけ | build_url(host="example.com", port=8080, protocol="https") | OK |
| 位置 → キーワード | build_url("example.com", port=8080, protocol="https") | OK |
| キーワード → 位置 | build_url(host="example.com", 8080, "https") | SyntaxError |
「位置 → キーワード」の順番を守る。これだけは覚えておきましょう。
動きを追ってみる
位置引数とキーワード引数がどう紐付くかを図にしてみます。
評価の流れを箇条書きで言い換えると、次のとおりです。
- 呼び出し時の引数を順番に取り出す
名前=値の形なら、関数定義の同名パラメータに紐付ける- そうでなければ、まだ埋まっていない位置パラメータに順に詰める
- 全パラメータが埋まったら関数本体を実行、足りなければ
TypeError
Python のインタプリタは呼び出しのたびにこの紐付けを行います。
キーワード引数のメリット
キーワード引数を使うメリットは次のとおりです。
- 引数の意味がコードから読み取れる
- 順番を覚えなくて良い
- デフォルト引数の一部だけを上書きできる
- 引数を増やしたときも既存コードを壊しにくい
3 つ目は特に便利です。
Python
def connect(host, port=80, timeout=30, retries=3):
return (host, port, timeout, retries)
connect("example.com", retries=5)port と timeout はデフォルト値のまま、retries だけ上書きしています。位置引数だけだと、間にある port や timeout を全部書く必要がありますが、キーワード引数なら必要なものだけ指定できます。
実例
少し実践的な例を見てみましょう。グラフを描画する関数の color linestyle marker などはキーワード引数で渡すのが一般的です。
Python
def plot(x, y, color="blue", linestyle="-", marker=None):
return {"x": x, "y": y, "color": color, "linestyle": linestyle, "marker": marker}
result = plot([1, 2, 3], [4, 5, 6], color="red", marker="o")
print(result)位置引数 x y の後に、color と marker だけキーワードで指定しています。linestyle はデフォルトのままです。
よくある間違い
- 位置引数より前にキーワード引数を書いてしまう
- 同じ引数を 2 回指定してしまう (
TypeError: multiple values for argument) - 関数定義にない名前で呼び出してしまう (
TypeError: unexpected keyword argument)
2 つ目は典型的な事故です。
Python
def hello(name):
return f"Hi {name}"
hello("Taro", name="Jiro")位置で "Taro" を渡してから、キーワードでも name="Jiro" を渡しているので、エラーになります。
同じ引数を 2 回指定するのは、コードを後から書き換えたときに発生しがちです。エラーメッセージを読めばすぐに原因が分かります。
ここまでの要点
キーワード引数は 引数名=値 の形、順番自由で読みやすい。位置 → キーワードの順序を守らないと SyntaxError。同じ引数を二重指定すると TypeError。
やってみよう
それでは、width と height を引数に取り、width * height の長方形の面積を返す関数 area を書いてみましょう。手順は次のとおりです。
def area(width=1, height=1):でデフォルト引数1を持たせて定義するwidth * heightをreturnする- テストで
area(width=5, height=3)が15を返すことを確認する
両方ともデフォルト値 1 を持たせ、呼び出し側でキーワード引数として渡せるようにしてください。テストでは area(width=5, height=3) のような形で呼び出されます。
よくある質問
Q. このトピックは Python 以外の言語でも同じ書き方ですか?
A. 考え方は他言語と共通ですが、構文や標準ライブラリは異なります。Python はインデントでブロックを表し、コロン + 改行で構造を作るのが特徴です。他言語に移行する際は基本概念を維持しつつ、構文の差分を意識して書き換えると混乱が少ないです。
Q. 実行してエラーが出た場合の対処は?
A. エラーメッセージの最後の行(TypeError や NameError などの型)から原因と該当行を確認します。Python はトレースバックが下から上に読むと「呼び出し元 → 内部」の順で辿れます。print や IDE のデバッガで途中の変数を確認すると原因が見えてきます。
Q. 次のステップで何を学ぶべきですか?
A. 本レッスンの内容を理解できたら、本文の「やってみよう」を実装し、章末クイズに進むのがおすすめです。さらに自分のミニアプリ(電卓・todo・スコア集計など)に応用するとスキルが定着します。詰まったら本文の H2 セクションに戻って読み返してください。
次のレッスン
次は 可変長引数 args と kwargs で、引数を名前で指定するキーワード引数の使い方を学びます を学びます。
事前確認 — 進む前に次の 3 つができることを確認しましょう。
- キーワード引数 の要点を自分の言葉で説明できる
- このレッスンの最小コード (または操作手順) を見ずに書ける
- 練習問題やクイズで間違えた箇所を読み直して理解した
理解度チェック (30 秒)
Q. キーワード引数 とは何か、1 文で説明してください。
A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。
関連レッスン
要件
- area 関数を定義する
- width と height のデフォルト値を 1 にする
- width * height を return する
入出力例
test-cases.txt
area(5, 3) → 15
area() → 1
area(4) → 4
area(10, 10) → 100