はじめに
Pythonで関数を定義するとき、ただ引数を並べるだけじゃもったいない!
実は「デフォルト値」や「可変長引数(*args, **kwargs)」を使えば、もっと柔軟で読みやすいコードが書けます。
今回は「ログ出力関数」を例に、初心者でも分かりやすいように解説していきます。
やりたいこと
-
関数にデフォルト値を設定して、省略可能な引数を作る
-
*args
で複数の引数をまとめて受け取る -
**kwargs
で辞書形式の引数を受け取る -
実務的な例として、ログ出力関数を便利に設計する
準備するもの
ライブラリ
今回は標準機能だけでOK!特別なライブラリは不要です。
コードスクリプト
コードスクリプトの概要
ここから実際に「デフォルト値」「*args」「**kwargs」の3つを使って関数を書いていきます。
最後にそれらを組み合わせた「ログ出力関数」を作って、実際の使い方を試してみましょう。
デフォルト引数の使い方
def greet(name, message="こんにちは"): print(f"{name}さん、{message}") greet("花子") # 引数を省略 → デフォルト値が使われる greet("太郎", "お疲れさま") # メッセージを指定
コード解説
-
message="こんにちは"
としておくと、省略した場合に「こんにちは」が使われます。 -
毎回同じメッセージを入力する手間が省けます。
*args の使い方
def add_numbers(*args): total = sum(args) print("合計:", total) add_numbers(1, 2, 3) add_numbers(5, 10, 15, 20)
コード解説
-
*args
は「複数の引数をまとめてタプルにして受け取る」仕組みです。 -
何個渡しても受け取れるので、柔軟な関数が作れます。
**kwargs の使い方
def print_user_info(**kwargs): for key, value in kwargs.items(): print(f"{key}: {value}") print_user_info(name="花子", age=25, city="Tokyo")
コード解説
-
**kwargs
は「辞書形式の引数」を受け取ります。 -
関数呼び出し側で
key=value
形式にすれば、自由にデータを渡せます。
実務例:ログ出力関数
def log(message, level="INFO", *args, **kwargs): print(f"[{level}] {message}") if args: print("追加情報:", args) if kwargs: print("詳細設定:", kwargs) # 使用例 log("処理を開始しました") log("ファイルを読み込みました", "DEBUG", "file.csv", "encoding=UTF-8") log("ユーザー情報更新", "INFO", user="hanako", status="success")
実行結果
[INFO] 処理を開始しました [DEBUG] ファイルを読み込みました 追加情報: ('file.csv', 'encoding=UTF-8') [INFO] ユーザー情報更新 詳細設定: {'user': 'hanako', 'status': 'success'}
コード解説
-
level="INFO"
→ ログレベルのデフォルト値を設定 -
*args
→ ファイル名や補足情報をまとめて渡せる -
**kwargs
→ ユーザーやステータスなど、キー付きの情報を渡せる -
実務でよく使うログ関数を柔軟に設計できます!
注意点
-
デフォルト引数は「可変オブジェクト(リストや辞書)」を使うと意図しない挙動になることがあるので注意。
def add_item(item, items=[]): # ← NG items.append(item) return items
こうすると、呼び出すたびにリストが共有されてしまいます。
✅ 解決策: None
を使って初期化する
def add_item(item, items=None): if items is None: items = [] items.append(item) return items
まとめ
今回は関数の便利な引数の使い方を紹介しました。
-
デフォルト値で省略可能な引数を作れる
-
*args
で複数の引数をまとめて受け取れる -
**kwargs
で柔軟に辞書形式の引数を扱える -
実務例として「ログ出力関数」に応用できる
これをマスターすると「関数の設計力」がグッと上がります。
私自身も実務でログ関数を作るときや、可変なデータを扱う関数を書くときによく使っています。
コメント